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 mit list_of(...)(...)(...) halt ungewohnt aber list_of ist nichtsdestotrotz toll 🙂



  • wow!
    damit kann ich doch was anfangen!
    vielen dank leute! 🙂


Anmelden zum Antworten