mehrdimensionale vektoren



  • 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