Matrix & Iterator

schickano

Grünschnabel
Hallo Leutz,

ich hab viel mit Matrizen zu tun.
C++:
	vector<double> value;
	vector<vector<double>> matrix;

	for(int i = 0; i < 10; ++i)
		value.push_back(i);
	for(int i = 0; i < 5; ++i)
		matrix.push_back(value);
Um auf die einzelnen Elementen zuzugreifen habe ich stinknormale for-Schleifen benutzt. Wie z.B.
C++:
	for(int row = 0; row < matrix.size(); ++row){
		for(int column = 0; column < matrix.at(row).size(); ++column)
			cout << matrix.at(row).at(column) << '\t';
		cout << endl;
	}
Letztens habe ich wat über Iteratoren gelesen und wollte einfach ma los programmieren.

Resultat:
C++:
	vector<vector<double>>::iterator it_row;
	vector<double>::iterator it_column;
	
	for(it_row = matrix.begin(); it_row < matrix.end(); ++it_row)
		for(it_column = matrix.at(it_row).begin(); it_column matrix.at(it_row).end(); ++it_column)
			cout << *it_column << '\t';
	cout << endl;
Naja, das funktioniert natürlich nicht! Ehrlich gesacht, kam ich schon ab der zweiten for-Schleife ins schwitzen.
Könnt ihr mir da Tipps geben und würdet ihr mir empfehlen weiter mir Iteratoren zu arbeiten? Wenn ja, warum? Bzw wo liegt da der Vorteil.

tausend Dank im voraus :D
 
Hi.

Mit Iteratoren zu arbeiten ist sicherlich sinnvoll. Es reduziert Fehlerquellen beim Arbeiten mit Indizes (< oder <= Länge?) und ist manchmal auch noch effizienter. Außerdem kann man den zugrundeliegenden Container austauschen ohne den Code ändern zu müssen.

Dazu sollte man aber nicht per Hand die Iterator-Typen angeben, sondern typedef's benutzen:
C++:
// Typ Alias vereinbaren
typedef std::vector<std::vector<double> > matrix_type;

matrix_type matrix;

// ...

// wenn die Elemente nicht verändert werden, besser const_iterator verwenden, 
// sonst iterator

for (matrix_type::const_iterator row = matrix.begin(), row_end = matrix.end();
     row != row_end; 
     ++row)
{
   for (matrix_type::value_type::const_iterator col = row->begin(), col_end = row->end();
        col != col_end;
        ++col)
   {
       cout << *col << '\t';
   }
   cout << endl;
}

Richtig nützlich sind die Iteratoren aber wenn man sie mit den Standardalgorithmen kombiniert:
C++:
for (matrix_type::const_iterator row = matrix.begin(), row_end = matrix.end();
      row != row_end; 
      ++row)
{
   std::copy (row->begin(), row->end(), ostream_iterator<double>(cout, "\t"));
   cout << endl;
}
Gruß
 
Zuletzt bearbeitet:
Hey deepthroat,
wo du hier das Beispiel mit den Iteratoren gemacht hast.
Kannst du kurz erklären was der unterscheid zwischen const_iterator und iterator ist?
Leider steht genau das in meinem C++-Buch nicht drinnen.
Grüße
 
Zurück