2013-04-11 2 views
5

ich lerne C++, so dass ich kann nicht richtig sein zu verstehen, aber ich habe gelesen, nur dass der Bereich Insert-Funktion einen Iterator unter dem neuen Standard zurück (C++ Grundierung 5. Auflage, cplusplus.com, cppreference.com und verschiedene Antworten darauf hindeutet, es zu benutzen um die Iterator-Gültigkeit zu erhalten).STL-Container-Range-Insert-Funktionen, die unter C++ 11 void zurückgeben?

Von cppreference.com:

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

jedoch jede Version von Cygwin GCC und MinGW, die ich versucht habe, ist zurückgekehrt Leere mit -std = C++ 11. Selbst wenn man sich die Header anschaut, sieht es so aus, als wäre es geschrieben und es gibt nichts, was ich ändern könnte, um das zu beheben.

Was fehlt mir?

Hier ist die 'Ende des Kapitels Übung' Funktion, die ich versuchte zu schreiben; eine Saite mit einem anderen innerhalb einer bestimmten Zeichenfolge zu ersetzen:

(ich verstehe es nicht bestimmungsgemäß funktioniert so, wie es geschrieben ist)

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

Welche * Version * von MinGW Sie verwenden? Bitte sag nicht "Jede Version" *. Das hilft nicht. Sei genau. – Nawaz

+0

Ah, danke. Der neueste Build mit 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; und MinGW-TDM 4.7.1-dw2 – Habnab

+0

Versuchen. GCC '4.8.0'. Es ist das Neueste! – Nawaz

Antwort

4

Es gibt keine Compiler, der vollständig noch C++11 unterstützt. Spätere Versionen von gcc und clang haben eine Mehrheit des neuen Standards implementiert, aber es gibt noch Teile, die getan werden müssen. Tatsächlich zeigt bei basic_string.h für gcc 4.7.0 suchen, dass diese Version von insert noch nicht aktualisiert worden:

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

Wenn es nicht nur ich vermasselt Dinge, erleichtert das einige der Frustration, obwohl ich wünschte, dass ich eine unterstützte Version finden könnte. Danke für die Hilfe! – Habnab

+2

@Habnab: Visual Studio 11 hat es richtig implementiert. –

+0

@BenjaminLindley: Danke. Obwohl ich versucht habe, VS aus irgendeinem Grund zu vermeiden, der jenseits meiner ist. Ich versuche, mich an ein Minimum an Werkzeugen zu halten, während ich die Sprache lerne (vim und make/tup so weit). Ich kann nur irgendwann nachgeben. Vielen schätzen die Hilfe. – Habnab