2013-04-14 10 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); 

     } 
    } 

} 

Quindi, mi piacerebbe che questa funzione sostituisse tutte le occorrenze della stringa precedente nel vettore con la sostituzione delle stringhe. Ma quando si chiama questa funzione, semplicemente non cambia affatto il vettore. Non sono sicuro di utilizzare la cancellazione e di inserire correttamente le funzioni. Qualche idea?Sostituzione di elementi nel vettore utilizzando la cancellazione e inserimento

+3

Non dovresti passare il vettore come _reference_? –

+0

Ah amico, mi sento così stupido in questo momento .... Grazie! –

+5

Non è necessario cancellare e inserire. Assegna semplicemente: '* it = replacement;'. Ciò elimina qualsiasi problema riguardante l'invalidazione dell'iteratore e rimuove un po 'di zangole per rimuovere un elemento, quindi apre un foro per l'inserimento dove quell'elemento era. –

risposta

7

All'inizio è necessario passare il vettore per riferimento, non per valore.

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

Seconda cancellare e inserire invalidates esso, è necessario aggiornare con nuovi iteratore restituito dalla cancellazione

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

Non è questo UB? Menzionare 'it' dopo la chiamata a' cancella' è UB, e tu menzioni 'it' nella tua chiamata a' insert'. Penso che devi usare una soluzione alternativa con 'std :: distance'. –

+0

@Enn - non hai notato che 'it' è assegnato con il * risultato * di' cancella() '? L'iteratore invalidato non può essere utilizzato, perché "it' ora contiene un iteratore valido; lo stesso vale per la seguente riga 'insert()'. –

+0

Apparentemente non l'ho fatto ... –

2

Si passa il vostro std::vector come un valore. Per cambiare il std::vector si passa alla funzione, dichiarare come riferimento

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

Il & indica che si passa la vostra std::vector per riferimento e in modo da poter accedere all'oggetto che avete passato.

E non cancellare l'elemento, è sufficiente sostituirlo.

3
C'è

è un ready-made algorithm per il vostro problema:

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

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

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

Può o non può valere la pena notare che questo deduce 'T' in' replace' come 'char [4]'. Le operazioni che mischiano 'string' e' const char * 'dovrebbero essere efficienti, quindi non penso che importi in questo caso, ma se vuoi passare in letterali stringa con lunghezze diverse allora hai bisogno di una conversione. –

Problemi correlati