2013-04-11 13 views
5

Sto solo imparando C++, quindi potrei non capirlo correttamente, ma ho letto solo che la funzione di inserimento intervallo restituisce un iteratore sotto il nuovo standard (C++ Primer 5th Ed, cplusplus.com, cppreference.com e varie risposte che suggeriscono di usarlo per mantenere la validità dell'iteratore).Le funzioni di inserimento intervallo dei contenitori STL restituiscono void in C++ 11?

Da cppreference.com:

template< class InputIt > 
iterator insert(const_iterator pos, InputIt first, InputIt last); 

vuoto Tuttavia, tutte le versioni di Cygwin GCC e MinGW che ho provato è tornato con -std = C++ 11. Anche guardando le intestazioni sembrerebbe che sia così che è scritto, e che non c'è nulla che possa modificare per sistemarlo.

Cosa mi manca?

Ecco la funzione "fine del capitolo dell'esercizio" che stavo tentando di scrivere; sostituzione di una stringa con un'altra all'interno di una stringa data:

(Capisco che non funziona come previsto il modo in cui è scritto)

void myfun(std::string& str, const std::string& oldStr, const std::string& newStr) 
{ 
    auto cur = str.begin(); 
    while (cur != str.end()) 
    { 
     auto temp = cur; 
     auto oldCur = oldStr.begin(); 
     while (temp != str.end() && *oldCur == *temp) 
     { 
      ++oldCur; 
      ++temp; 
      if (oldCur == oldStr.end()) 
      { 
       cur = str.erase(cur, temp); 
       // Here we go. The problem spot!!! 
       cur = str.insert(cur, newStr.begin(), newStr.end()); 
       break; 
      } 
     } 
     ++cur; 
    } 
} 
+1

Quali * * versione di MinGW si sta utilizzando? Per favore non dire * "ogni versione" *. Questo non aiuta. Sii specifico. – Nawaz

+0

Ah, grazie. L'ultima build che utilizza mingw-get-inst-20120426.exe, 4.6.2; i686-W64-mingw32-gcc-dw2-4.8.0-win32_rubenvb; x86_64-W64-mingw32-gcc-4.6.3-2-release-win64_rubenvb; e MinGW-TDM 4.7.1-dw2 – Habnab

+0

Prova. GCC '4.8.0'. È l'ultimo! – Nawaz

risposta

4

Non v'è alcun compilatore che supporta pienamente C++11 ancora. Le versioni successive di gcc e clang hanno la maggioranza del nuovo standard implementato, ma ci sono ancora parti che devono essere fatte. In effetti, guardando basic_string.h per gcc 4.7.0 mostra che questa versione di insert non è ancora stato aggiornato:

template<class _InputIterator> 
    void 
    insert(iterator __p, _InputIterator __beg, _InputIterator __end) { ... } 
+0

Se non sono solo io a mettere a posto le cose, questo allevia un po 'di frustrazione, anche se mi piacerebbe poter trovare una versione supportata. Grazie per l'aiuto! – Habnab

+2

@Habnab: Visual Studio 11 lo ha implementato correttamente. –

+0

@BenjaminLindley: Grazie. Tuttavia, ho cercato di evitare VS per qualche motivo che è al di là di me. Cercando di attenermi a un set minimo di strumenti mentre imparo il linguaggio (vim e make/tup finora). Potrei arrendermi ad un certo punto. Apprezzo molto l'aiuto. – Habnab