2013-04-11 14 views
5

Po prostu uczenie się C++, więc może nie rozumiem tego poprawnie, ale przeczytałem tylko, że funkcja wstawiania zakresu zwraca iterator pod nowym standardem (C++ Primer 5th Ed, cplusplus.com, cppreference.com i różne odpowiedzi sugerujące jego użycie zachować aktualność iteratora).Funkcje wstawiania kontenerów STL powracają do pustej przestrzeni pod C++ 11?

Od cppreference.com:

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

Jednak każda wersja Cygwin i MinGW GCC że próbowałem powrócił void użyciu -std = C++ 11. Nawet patrząc na nagłówki wydaje się, że tak to jest napisane i że nic nie mogę zmienić, aby to naprawić.

Czego mi brakuje?

Oto funkcja "końca rozdziału ćwiczenia", którą próbowałem napisać; zastępując jeden ciąg z drugiego w obrębie danego łańcucha:

(rozumiem, że nie będzie działać zgodnie z przeznaczeniem sposób jest napisane)

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

Która wersja * * z MinGW używasz? Proszę nie mówić * "każdej wersji" *. To nie pomaga. Być specyficznym. – Nawaz

+0

Ah, dziękuję. Najnowsza kompilacja za pomocą 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; i MinGW-TDM 4.7.1-dw2 – Habnab

+0

Spróbuj. GCC '4.8.0'. Jest najnowszy! – Nawaz

Odpowiedz

4

Nie ma kompilator, który w pełni obsługuje C++11 jeszcze. Późniejsze wersje gcc i clang mają zaimplementowaną większość nowego standardu, ale wciąż są części, które należy wykonać. Rzeczywiście, patrząc na basic_string.h dla gcc 4.7.0 pokazuje, że ta wersja insert nie została jeszcze zaktualizowana:

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

Jeśli nie chodzi tylko o to, że spapokowałem, to zmniejsza to frustrację, choć żałuję, że nie mogę znaleźć obsługiwanej wersji. Dziękuję za pomoc! – Habnab

+2

@Habnab: Visual Studio 11 ma to poprawnie zaimplementowane. –

+0

@BenjaminLindley: Dziękuję. Chociaż próbowałem uniknąć VS z jakiegoś powodu, który jest poza mną. Próbuję trzymać się minimalnego zestawu narzędzi, jak uczę się języka (vim i make/tup do tej pory). W pewnym momencie mogę się poddać. Bardzo doceniamy pomoc. – Habnab

Powiązane problemy