2013-04-06 20 views
11

Perché questo codicePerché ottengo "iteratori vettoriali incompatibili"?

#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; 
} 

mi danno il fallimento asserzione di debug, Espressione: vettore iteratori incompatibile (Visual C++ 2008)?

risposta

14

Iterator corrispondenti agli elementi vengono invalidati solo quando il vettore deve essere riallocato, che evita reserve.

Tuttavia, v.end() non sarà valido.

descrizione del standard di push_back e insert garantisce che

cause riallocazione se la nuova dimensione è superiore alla vecchia capienza. Se non si verifica alcuna riallocazione, tutti gli iteratori e i riferimenti prima del punto di inserimento rimangono validi.

v.end() non "prima del punto di inserimento".

+2

+1 Dang ... è dannatamente fastidioso. Qual è la soluzione migliore? – Mehrdad

+0

Un ciclo 'for' che funziona sull'indice? –

+0

@ Mehrdad, non immagino che 'insert' eviti questo casino? – chris