2013-04-06 16 views
11

Warum dieser CodeWarum bekomme ich "Vektor-Iteratoren inkompatibel"?

#include <algorithm> 
#include <iterator> 
#include <vector> 

int main() 
{ 
    std::vector<int> v; 
    v.push_back(1); 
    v.push_back(2); 
    v.push_back(3); 
    v.reserve(v.size() * 2); // Reserve enough space to keep iterators valid 
    std::copy(v.begin(), v.end(), std::back_inserter(v)); 
    return 0; 
} 

geben Sie mir nicht die Debug-Assertion-Fehler, Expression: Vektor Iteratoren unvereinbar (Visual C++ 2008)?

Antwort

14

Iteratoren, die Elementen entsprechen, werden nur ungültig gemacht, wenn der Vektor neu zugewiesen werden muss, was reserve vermeidet.

v.end() wird jedoch nicht gültig bleiben.

Die Garantien Standard-Beschreibung der push_back und insert dass

Neuzuteilung Ursachen, wenn die neue Größe größer ist als die alte Kapazität ist. Wenn keine Neuzuweisung stattfindet, bleiben alle Iteratoren und Referenzen vor dem Einfügepunkt gültig.

v.end() ist nicht "vor dem Einfügepunkt".

+2

+1 Dang ... das ist so verdammt nervig. Was ist die beste Problemumgehung? – Mehrdad

+0

Eine For-Schleife, die auf dem Index arbeitet? –

+0

@Mehrdad, ich glaube nicht, 'Einfügen' vermeidet diese Unordnung? – chris