mehrdimensionale vektoren
-
bueffel schrieb:
super. das ist leider nur eindimensional.
Du hast ja auch nur zwei eindimensionale Vektoren verschachtelt.
-
wie sieht die syntax denn aus wenn ich ein - wie du schon richtig erwaehnt hast - verschachtelten vektor entsprechend erweitern will?
// edit:
m.resize(20);waer zu einfach.
-
Genauso wie bei allen anderen Operationen auch.
foobar.resize(42); // aeuszerer Vektor foobar[23].resize(17); // innerer Vektor
-
das is' ja simpel.
wundert mich. c++ ist doch sonst eher schwerfällig.
-
bueffel schrieb:
das is' ja simpel.
wundert mich. c++ ist doch sonst eher schwerfällig.Nur, wenn man nicht weiss, wie man damit umzugehen hat.

-
sorry, aber wieso segfaulted das:
m.resize(42); m.reserve(42); m[20][0] = "lol";hab doch wieder dicke genug platz.
-
FRAGE!
for(int i = 0; i < eintraege+1; i++) { for(int j = 0; j < 3; j++) { cout << "" << m[i].at(j) << ""; } }lässt sich das irgendwie umschreiben mittels vektor-iteratoren?
wenn ja, wie?
-
Klar lässt sich das auch in Iteratorschreibweise ausdrücken. Zuerst aber mal eine Möglichkeit einen 2D-vector in einem Rutsch zu deklarieren.
vector<vector<string> > m(10, vector<string>(3));Eine Schleife über alle Elemente eines 2D-vectors könnte so aussehen.
vector<vector<string> >::iterator it1 = m.begin(), end1 = m.end(); for( ; it1!=end1; ++it1) { vector<string>::iterator it2 = it1->begin(), end2 = it1->end(); for( ;it2!=end2; ++it2) { // jetzt zugreifen } }Man kann die Deklarationen der iteratoren auch in der for-Schleife machen.
-
bueffel schrieb:
FRAGE!
for(int i = 0; i < eintraege+1; i++) { for(int j = 0; j < 3; j++) { cout << "" << m[i].at(j) << ""; } }lässt sich das irgendwie umschreiben mittels vektor-iteratoren?
wenn ja, wie?for ( vector<vector<string> >::const_iterator i=m.begin(); i!=m.end(); ++i ) for ( vector<string>::const_iterator j=i->begin(); j!=i->end(); ++j ) cout << *j << " ";
-
Das hier
vector<vector<string> > m(10); for(int i = 0; i < 10; i++) m[i].resize(3);lässt sich auch kürzer schreiben:
vector<vector<string> > m( 10, vector<string>(3) );Der Konstruktor nimmt die Anzahl der Elemente und wahlweise einen zweiten Parameter, der angibt, wie diese Elemente aussehen sollen. Hier wird angegeben, dass zehn Elemente drin sein sollen, die jeweils
vector<string>(3)sind, also jeweils ein vector mit 3 strings.Übrigens wird das Ganze noch viel bequemer, wenn man boost (www.boost.org) einsetzt:
#include <iostream> #include <vector> #include <string> using namespace std; #include <boost/foreach.hpp> #include <boost/assign/list_of.hpp> using boost::list_of; #define foreach BOOST_FOREACH int main() { vector<vector<string> > person_list; // Zwei Personen zur Liste hinzufügen person_list.push_back( list_of ("Peter") ("Lustig") ("31337") ); person_list.push_back( list_of ("Dieter") ("Himmler") ("55") ); // Liste ausgeben foreach ( vector<string>& person, person_list ) // Alle Elemente von "person_list" durchlaufen, die Laufvariable heißt "person". { foreach ( string& elem, person ) // Alle Elemente von "person" durchlaufen, die Laufvariable heißt "elem" cout << elem << " "; cout << "\n"; } }Alternativ zur Belegung müsste dann auch Folgendes gehen:
vector<vector<string> > person_list = list_of ( list_of ("Peter") ("Lustig") ("31337") ) ( list_of ("Dieter") ("Himmler") ("55") ) ;Mit
list_ofkannst du halt immer einen vector von Elementen erstellen. Die Notation ist mitlist_of(...)(...)(...)halt ungewohnt aber list_of ist nichtsdestotrotz toll
-
wow!
damit kann ich doch was anfangen!
vielen dank leute!