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?