Neuer Versuch: Zweidimensionaler Vector



  • Im alten Thread wird mir wohl garantiert niemand helfen, außerdem konnte ich das Problem eingrenzen. Bitte den alten Thread schließen, danke!

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
    	vector<vector< int > > test;
    
    	test.resize(199);
    	cout<<test[13][34]<<endl;
    
    	return(0);
    }
    

    1.) Bei resize() steht nicht 0 drinne wie bei einem eindimensionalen vector.

    2.)

    vector<vector< int > > test;
    

    geht,

    vector<vector<int>>test;
    

    nicht, warum?

    3.) Heißt das nun, alle Methoden gelten nur für einen eindimensionalen Vector?

    Per "hand" löschen geht auch nicht:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
    	vector<vector< int > > test;
    
    	test.resize(35);
    
    	for(int i=0; i<35; ++i)
    		for(int k=0; k<35; ++k)
    			test[i][k] = 0;
    
    	cout<<test[13][34]<<endl;
    
    	return(0);
    }
    

    Gibt ein Debug Assertion failed. Wie arbeite ich richtig damit?



  • Vecci schrieb:

    2.)

    vector<vector< int > > test;
    

    geht,

    vector<vector<int>>test;
    

    nicht, warum?

    Siehe: http://www.c-plusplus.net/forum/viewtopic.php?t=82187&highlight=maximal+munch

    vector<vector< int > > test;
    

    test ist bisher ein leerer vector von leeren int-vectoren.

    test.resize(35);
    

    Jetzt ist test ein vector mit 35 *leeren* int-vectoren.

    for(int i=0; i<35; ++i)
            for(int k=0; k<35; ++k)
                test[i][k] = 0;
    

    Hier greifst du auf das k-te Element des i-ten *leeren* int-vectors zu. Das kann nicht gehen, da der i-te vector derzeit keinerlei Elemente aufnehmen kann. Du schreibst also in Speicher, der dir nicht gehört.

    Lösung:
    A) Du gibst jedem int-Vektor eine feste Größe:

    vector<vector< int > > test;
    test.resize(35);
    for (int i = 0; i < 35; ++i)
        test[i].resize(35);
    
    // OK
    for(int i=0; i<35; ++i)
        for(int k=0; k<35; ++k)
            test[i][k] = 0;
    

    Jetzt hast du einen vector von 35 int-vectoren, die jeweils 35 ints aufnehmen können.

    😎 Du verwendest eine Methode wie push_back anstatt des op[].

    vector<vector< int > > test;
    test.resize(35);
    
    for(int i=0; i<35; ++i)
        for(int k=0; k<35; ++k)
            test[i].push_back(0);
    

    Das push_back resized den vector automatisch, falls dies nötig ist.

    Aber warum schaust du nicht einfach mal in unsere FAQ:
    http://www.c-plusplus.net/forum/viewtopic.php?t=39489


Log in to reply