Vector



  • Hallo, habe vorhin folgendes Programm geschrieben:

    #include <iostream>
    #include <vector>
    
    int main()
    {
    	using std::vector;
    	using std::cout;
    	using std::cin;
    	using std::endl;
    
    	int tmp;
    	vector<int> vec_number(4, 0);
    	vector<int>::iterator iter = vec_number.begin();
    
    	cout << "Bitte Zahl eingeben: " << endl;
    	while(cin >> tmp)
    	{
    		if(iter != vec_number.end())
    		{
    			*iter = tmp;
    			iter++;
    		}
    		else
    			vec_number.push_back(tmp);
    	}
    	iter = vec_number.begin();
    	while(iter != vec_number.end())
    	{
    		cout << *iter << endl;
    		iter++;
    	}
    
    	return 0;
    
    }
    

    Danach ist mir aufgefallen, ha das geht doch einfacher:

    #include <iostream>
    #include <vector>
    
    int main()
    {
    	using std::vector;
    	using std::cout;
    	using std::cin;
    	using std::endl;
    
    	int tmp;
    	vector<int> vec_number;
    	vector<int>::iterator iter;
    
    	cout << "Bitte Zahl eingeben: " << endl;
    	while(cin >> tmp)
    	{
    		vec_number.push_back(tmp);
    	}
    	iter = vec_number.begin();
    	while(iter != vec_number.end())
    	{
    		cout << *iter << endl;
    		iter++;
    	}
    
    	return 0;
    
    }
    

    Nun hab ich eine Frage und ein Problem:
    Warum hat das erste Programm nach 7-8 Eingaben abgebrochen?
    Und bei meinem zweiten Code, gibt ihr mir nicht die Zahlen aus, warum?Habe schon rumprobiert, komme aber leider nicht auf den Fehler.
    EDIT: 😃 Habe ausversehen nur debugged un nicht ausgeführt^^
    Aber das erste würde mich noch interessieren 🙂

    -GhostfaceChilla-



  • GhostfaceChilla schrieb:

    Warum hat das erste Programm nach 7-8 Eingaben abgebrochen?

    Ja, das wundert mich auch. Nach meinem Kopfdebugging hätte es schon bei der sechsten Eingabe abgestürzen sollen. Standardkonform ist es nur bis Eingabe Nr. 5.



  • Und warum stürzt es ab?
    Es wird doch überprüft, wenn es nicht das Ende von numbers is, dann macht es die Ausführung, wenn es das Ende wäre, wird doch die Eingabe hinten ran gesetzt oder??

    -GhostfaceChilla-



  • Afaik werden Iteratoren wertlos, sobald resize aufgerufen wird.
    Nach dem vierten hinzufügen ist iter == vec_number.end() , weil die Größe 4 ist. Beim fünften mal werden push_back und resize aufgerufen, um mehr Platz zu schaffen. Somit wird iter ungültig.



  • Wurst schrieb:

    Afaik werden Iteratoren wertlos, sobald resize aufgerufen wird.
    Nach dem vierten hinzufügen ist iter == vec_number.end() , weil die Größe 4 ist. Beim fünften mal werden push_back und resize aufgerufen, um mehr Platz zu schaffen. Somit wird iter ungültig.

    Korrekt. Genauer gesagt ist der Zugriff auf iter nach dem ersten push_back böse. Der Abbruch nach 7-8 ist völlig normal, ein Abbruch nach 6 Eingaben wie in Headbuggys Kopf auch, ein Abbruch nach 273 Eingaben wäre auch denkbar gewesen.

    Herb Sutter schrieb:

    Welcome to the dark shady realms of undefined behavior.



  • Heißt das also folgender Code könnte auch nicht richtig funktionieren?

    #include <iostream>
    #include <vector>
    
    int main()
    {
        using std::vector;
        using std::cout;
        using std::cin;
        using std::endl;
    
        int tmp;
        vector<int> vec_number;
        vector<int>::iterator iter;
    
        cout << "Bitte Zahl eingeben: " << endl;
        while(cin >> tmp)
        {
            vec_number.push_back(tmp);
        }
        iter = vec_number.begin();
        while(iter != vec_number.end())
        {
            cout << *iter << endl;
            iter++;
        }
    
        return 0;
    
    }
    

    Weil da greife ich doch auch nach einem pushback auf iter zu oder?

    -GhostfaceChilla-



  • GhostfaceChilla schrieb:

    Weil da greife ich doch auch nach einem pushback auf iter zu oder?

    1. Du greifst auf den Container zu, nicht auf iter.
    2. Nein, das sollte funktionieren. Du weist iter einen gültigen Wert zu, nachdem du den Container mit push_back verändert hast. Da du danach nichts mehr am Container änderst, bleiben die Iteratoren auch gültig.
    3. Die zweite While-Schleife solltest du durch eine passende for-schleife ersetzen, das ist der übliche Weg, über Container zu iterieren und liest sich deshalb für das geübte Auge einfacher.

Anmelden zum Antworten