2013-04-14 16 views
5
void replace(vector<string> my_vector_2, string old, string replacement){ 

    vector<string>::iterator it; 
    for (it = my_vector_2.begin(); it != my_vector_2.end(); ++it){ 

     if (*it==old){ 
      my_vector_2.erase(it); 
      my_vector_2.insert(it,replacement); 

     } 
    } 

} 

So, ich möchte diese Funktion, um alle Vorkommen der Zeichenfolge alt im Vektor durch die Zeichenfolge ersetzen zu ersetzen. Aber wenn diese Funktion aufgerufen wird, ändert sich der Vektor einfach nicht. Ich bin mir nicht sicher, ob ich die Lösch- und Einfügefunktionen richtig verwende. Irgendwelche Ideen?Ersetzen von Elementen im Vektor mit Löschen und Einfügen

+3

Sollten Sie nicht den Vektor als _reference_ passieren? –

+0

Ah Mann, ich fühle mich jetzt so dumm .... Danke! –

+5

Sie müssen nicht löschen und einfügen. Ordnen Sie einfach zu: '* it = Ersetzung;'. Dadurch werden Probleme bei der Iterator-Invalidierung vermieden und eine Reihe von Änderungen entfernt, um ein Element zu entfernen. Anschließend wird ein Loch zum Einfügen geöffnet, an dem sich dieses Element befand. –

Antwort

7

Zuerst müssen Sie Vektor als Referenz übergeben, nicht nach Wert.

void replace(vector<string>& my_vector_2, string old, string replacement){ 

zweiten Lösch- und einfügen invalidates es, müssen Sie es mit neuen Iterator durch Löschzurück aktualisieren

it = my_vector_2.erase(it); 
it = my_vector_2.insert(it,replacement); 
+0

Ist das nicht UB? Erwähnen Sie 'es' nach dem Aufruf zum' Löschen' ist UB, und Sie erwähnen 'it' in Ihrem Aufruf zum' Einfügen'. Ich denke, Sie müssen einen Workaround mit 'std :: distance' verwenden. –

+0

@Enn - Haben Sie nicht bemerkt, dass 'it' mit dem * result * von' erase() 'zugewiesen wurde? Der invalidierte Iterator kann nicht verwendet werden, weil 'it' jetzt einen gültigen Iterator enthält; Das gleiche gilt für die folgende 'insert()' -Zeile. –

+0

Anscheinend habe ich nicht ... –

2

Sie passieren Ihre std::vector als Wert. Um die std::vector Sie an die Funktion übergeben zu ändern, erklären sie als Referenz

void replace(vector<string>& my_vector_2, string old, string replacement){ } 

Die & bedeutet, dass Sie Ihre std::vector durch Verweis übergeben und so können Sie das Objekt zugreifen Sie weitergegeben.

Und löschen Sie das Element nicht, ersetzen Sie es einfach.

3

Es gibt ein fertiges algorithm für Ihr Problem:

#include <algorithm> 
#include <string> 
#include <vector> 

std::vector<std::string> v; // populate 

std::replace(v.begin(), v.end(), "old", "new"); 
+0

Es kann oder darf nicht erwähnenswert sein, dass dies "T" in "ersetzen" als "char [4]" ableitet. Operationen, die 'string' und' const char * 'mischen, sollten effizient sein, daher denke ich, dass es in diesem Fall keine Rolle spielt, aber wenn Sie String-Literale mit unterschiedlichen Längen übergeben wollen, brauchen Sie eine Konvertierung. –

Verwandte Themen