std::vector, die 21te: Iterator auf beliebiges Element erhalten



  • Wie geht das?
    Ich weiß nur die man mit begin() und end() Iteratoren auf den Anfang / das Ende erhalten kann und das erase() und insert() Iteratoren zurückgeben 😕



  • std::vector<int> v(10,10);
    std::vector<int>::iterator i = v.begin()+7;
    


  • Soweit bin ich auch schon. Ich wollte diesen Gedanken aber nicht umsetzen, weil ich es für eine unschöne Notlösung hielt...

    Gibt es da nix eleganteres?

    Nachtrag: Ok, so schlimm ist es auch wieder nicht...



  • Wenn Du das nte Element von begin() aus willst kannst Du den operator[] verwenden.

    Wenn Du relativ von einem Iterator n Elemente weiter willst ist der operator+ das was die Lösung bietet.



  • Also dieser Versuch bestimmte Elemente des Vektors zu löschen schlägt mit einem Programmabsturz fehl:

    if(particleArray[i].tooSlow(float(0.1)))
        particleArray.erase(particleArray.begin()+i);
    

    Und die MSDN hilft mir mit

    The type describes an object that can serve as a random-access iterator for the controlled sequence. It is described here as a synonym for the unspecified type T0.

    auch nicht weiter...

    Die Iteratoren haben doch den + - Operator überladen, sodass ein +3 den Iterator nicht 3 Byte sondern 3 Byte x sizeof(Variablentyp) weiterverschiebt, oder?



  • Die randomiteratoren verhalten sich so, ja.



  • Wieso gibt es dann einen Programmabsturz?



  • Das "i" sieht nach einer Schleife aus. Wenn das so ist, kannst du den Rest der Schleife (oder zumindest die for()-Zeile) noch posten?



  • Prüfe mal ob der Index richtig ist und nicht die grenzen Überschreitet.

    Hier ein kleines Minimalbeispiel:

    #include "vector"
    #include <iostream>
    using namespace std;
    
    struct test
    {
    	int i;
    	void ausgabe()
    	{
    		cout<<i<<'\n';
    	}
    };
    
    int main(int argc, char* argv[])
    {
    	vector<test> vec;
    	test temp;
    
    	temp.i = 12;
    	vec.push_back(temp);	// 0
    	temp.i = 13;
    	vec.push_back(temp);	// 1
    	temp.i = 14;
    	vec.push_back(temp);	// 2
    
    	cout<<vec.size()<<endl;
    
    	cout<<"Entferne nun:" ;
    	vec[2].ausgabe();
    	vec.erase(vec.begin()+2);
    
    	cout<<vec.size()<<endl;
    
    	cout<<"Noch enthaltene Elemente\n";
    	for(vector<test>::iterator pos = vec.begin();pos != vec.end();++pos)	
    		cout<<pos->i<<'\n';
    
    	return 0;
    }
    


  • nach einen erase sind die alten iteratoren ungültig (i.d.r. nicht aber das implementierungs abhänig), aber die lösung ist nicht weit: erase gibt ein gültigen iterator zurück der dann auf das element zeigt nach den gelöschten
    was machst du den noch in der for, vielleicht inserts?


Anmelden zum Antworten