2013-04-13 12 views
8

Credo che poiché C++ 11, la funzione di erase maggior parte dei contenitori (es std::vector) accetta un const_iterator come parametro:C++ 11: eliminare utilizzando un const_iterator

iterator erase (const_iterator position); 

Still miei compilatori (GCC 4.8 e Clang 3.2, entrambi che usano GCC libstdC++) non mi permetteranno di usare tale funzione, anche quando compilo con --std=c++11.

È un errore di compilatore/libstdC++ o ho fatto qualcosa di negativo? Si tratta di un codice di esempio:

#include <vector> 

int main() 
{ 
    std::vector<int> v; 
    v.push_back(1); 
    v.push_back(2); 
    v.push_back(3); 

    std::vector<int>::const_iterator i = v.begin(); 
    while(i != v.end()) { 
     i = v.erase(i); 
    } 

    return 0; 
} 
+3

Questo sembra essere un problema con l'implementazione della libreria standard, non con il compilatore stesso –

+0

@Andy: sì, se l'errore non è mio, è molto probabilmente di libstdC++. Sono comunque sorpreso che si tratti di un problema di libstdC++ (o del compilatore, in ogni caso), dal momento che ho trovato molte domande sulla cancellazione di un 'const_iterator', ma ** tutti ** di loro precedenti a C++ 11 .. – peoro

risposta

7

Questo problema è documentato here ed è riportato come un'implementazione parziale per ora.

CTRL + F con il browser e cercare N2350.

Se si utilizza Linux, è possibile creare una versione di sviluppo della libreria libcxx dal progetto LLVM che è possibile scaricare da here; Non so se questo risolve qualcuno dei problemi che stai riscontrando, ma lo propongo come alternativa allo libstdc++.

+1

Hai ragione, l'ho perso. È abbastanza strano, tuttavia, che ci siano molte domande su questa funzione (su SO e su tutto il web), ma nessuna di esse affronta la sua mancanza in 'libstdC++' ... – peoro

+0

Questo problema è stato risolto? (Giugno 2014?) –

+0

@JonathanLeaders: ho appena visto il tuo messaggio. Sì, ora è riparato. – peoro