mehrdimensionale vektoren
-
Hallo Freunde,
ich habe die STL für mich entdeckt und habe aber noch eine kleine Frage.
Wär doch super wenn mir hier jemand helfen könnte. Oder besser gesagt einen Tip gegben würde.Frage:
Und zwar hab ich ja so bildlich gesehen 'ne Art Tabelle erzeugt. 3 Spalten, 10 Zeilen.
Wie kann ich die im Nachhinein veraendern? Ich haette gerne waehrend der Laufzeit 3 Spalten und 15 Zeilen.#include <iostream> #include <vector> #include <string> using namespace std; int main(void) { vector<vector<string> > m(10); for(int i = 0; i < 10; i++) m[i].resize(3); m[0][0] = "Peter"; m[0][1] = "Lustig"; m[0][2] = "31337"; m[1][0] = "Dieter"; m[1][1] = "Himmel"; m[1][2] = "51"; for(int i = 0; i < 3; i++) cout << m[1].at(i); return 0; }
Ich bedanke mich herzlichst und wünsche einen schönen Tag!
ciao
der bueffel!
-
-
super. das ist leider nur eindimensional.
-
bueffel schrieb:
super. das ist leider nur eindimensional.
??
Du kannst auch die inneren vektor verändern..
-
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_of
kannst 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!