2017-10-22 2 views
0

Ich versuche, value in C++ Vektor v vor i -ten Element (oder nach Element (i-1)) einzufügen. Der Code ist sehr einfachIst garantiert, dass v.begin() + v.size() == v.end() für C++ Vektor v?

v.insert(v.begin() + i, value); 

Ich bin sicher, dass diese Aussage funktioniert, wenn i zwischen 0 einschließend und v.size() ausschließlich ist. Außerdem glaube ich, dass, wenn i streng größer als v.size() oder negativ ist, die Anweisung undefiniertes Verhalten hat. Aber was, wenn i == v.size()? Ist v.begin() + i ein gültiger Iterator? Ist garantiert, dass v.begin() + v.size() == v.end()?

Wenn es garantiert ist, könnten Sie die genauen Teile des Standards referenzieren? Wenn sich die Garantien zwischen Standardversionen ändern, ist es außerdem hilfreich, diese Änderungen zu kennen.

Ohne diese Garantien ich wahrscheinlich den folgenden Code verwenden soll:

if (i == v.size()) { 
    v.insert(v.end(), value); // or just v.push_back(value); 
} else { 
    v.insert(v.begin() + i, value); 
} 

Aber es wäre prägnanter sein nur eine Zeile wie am Anfang dieser Frage zu verwenden. In der Praxis funktioniert der Code von Anfang an, aber ich möchte sicher sein, dass er überall funktioniert. Ich habe versucht, den Standard zu durchsuchen, konnte aber diese Eigenschaft eines Direktzugriffs-Iterators nicht finden.

+0

Sie scheinen hier zwei verschiedene Fragen zu stellen. Eins über die Operation von insert() und eins über den Vergleich von Iteratoren. –

+0

@NeilButterworth Ich hoffe nein, einfügen ist nur eine Anwendung. Wir sollten es einen gültigen Iterator zur Verfügung stellen, dann funktioniert es gut. Der einzige mögliche gültige Wert von v.begin() + v.size() ist v.end(). Aber ich bin mir nicht sicher, dass es garantiert gültig ist. –

+1

"Nur weil du paranoid bist, heißt das nicht, dass sie nicht hinter dir her sind." – Slava

Antwort

3

Wie bereits erwähnt auf documentation

pos - Iterator vor dem der Inhalt eingefügt werden. pos kann das Ende() Iterator

so sein ja Sie end() verwenden können. Wie für Ihre andere Frage:

Ist es garantiert, dass v.begin() + v.size() == v.end()?

ja es ist, sonst diese Schleife:

for(auto it = vec.begin(); it != vec.end(); ++it) ... 

würde nicht richtig funktionieren, wie es ++it genau vec.size() mal ausgeführt werden müssen.

+0

Ihr Beweis mit for-Schleife-Beispiel sieht korrekt aus.Könnten Sie zusätzlich den Standard über die Äquivalenz von '+ x' für einen Direktzugriffs-Iterator anführen 'x' Operationen' ++ '? Es ist vollkommen logisch, so zu sein, aber ich brauche ein bisschen mehr Beweis. –

+1

Ist das http://en.cppreference.com/w/cpp/concept/RandomAccessIterator gut genug? – Slava

+0

Sehr guter Tisch, sehr gute Erklärung Ich suchte genau nach dieser Tabelle im Standard und konnte sie nicht finden Könnten Sie mir helfen, sie dort zu finden? –

Verwandte Themen