Also habe ich eine Menge Code geschrieben, der über index [] auf Elemente in einem stl-Vektor zugreift, aber jetzt muss ich nur noch einen Teil des Vektors kopieren. Es sieht so aus, als wäre vector.insert(pos, first, last)
es die Funktion, die ich will ... außer ich habe nur die ersten und letzten als Ints. Gibt es eine gute Möglichkeit, einen Iterator für diese Werte zu erhalten?
200
Antworten:
Versuche dies:
quelle
std::next(v.begin(), index)
Weg von @dirkgently
( v.begin() + index )
nett und schnell für Vektoren erwähntAber die meisten generischen Methoden und für Direktzugriffsiteratoren funktionieren auch mit konstanter Zeit.
std::advance
( v.begin(), index )
Unterschiede in der Verwendung bearbeiten :
oder
nach @litb Notizen hinzugefügt.
quelle
std::vector
, macht es keinen Sinn, es zu verwendenstd::advance
. Es bringt Sie nur dazu zu denken, dass Sie containerunabhängigen Code schreiben (was Sie nicht tun, wenn Sie an Iterator-Invalidierungsregeln, unterschiedliche Laufzeitkomplexitäten und so weiter denken). Der einzige Fall,std::advance
der Sinn macht, ist, wenn Sie selbst eine Vorlage schreiben, die nicht weiß, um welche Art von Iterator es sich handelt.Ebenfalls;
auto it = std::next(v.begin(), index);
Update: Benötigt einen C ++ 11x-kompatiblen Compiler
quelle
Oder Sie können verwenden
std::advance
quelle
Tatsächlich soll std :: vector bei Bedarf als C-Tab verwendet werden. (Soweit ich weiß, fordert der C ++ - Standard eine Vektorimplementierung an - Ersatz für ein Array in Wikipedia. ) Zum Beispiel ist es meiner Meinung nach völlig legal, dies wie folgt zu tun:
Natürlich darf foo entweder die als Parameter übergebene Adresse nicht kopieren und irgendwo speichern, oder Sie sollten in Ihrem Programm sicherstellen, dass niemals neue Elemente in vec gepusht werden oder dass eine Änderung der Kapazität angefordert wird. Oder Risikosegmentierungsfehler ...
Daher führt es in Ihrem Beispiel zu
quelle