2017-09-18 1 views
-1

Ich versuche, eine Funktion zu erstellen, die einen Vektor durch Verweis einnimmt, und wenn es einen Vektoreintrag 2 sieht, würde es den Eintrag löschen und durch 4 Kopien von 5 ersetzen.vector.insert passt den Vektor nicht an?

also, wenn der Vektor ist 222 (dann ist es Größe n = 3), ich will 555555555555 als den neuen Vektor

jedoch funktioniert es nur für die ersten, wenn der Index < n ist.

also gerade jetzt, würde es ändern, ein Vektor zu 555522 irgendwelche Ideen, wie man den Vektor Größe ändern?

void replace2 (vector <int>* a, int n){ 

    for (int i = 0; i < n; ++i){ 
    if ((*a)[i] == 2){ 
     (*a).erase((*a).begin() + i); 
     for(int j = 0; j < 4; ++j){ 
     (*a).insert((*a).begin() + i, 5); 
      } 
     } 
     } 

} 
+4

[off topic] Verwenden Sie einen Verweis auf Ihren Vektor anstelle eines Zeigers. – Charles

+3

Nach der ersten Iteration der Schleife ist '(* a) [i]' nicht länger gleich 2. Verbleibende Iterationen tun nichts. –

+0

@Charles, wenn ich die Funktion aufrufen, ich ersetze2 (& a, 3) – shoestringfries

Antwort

5

Das Problem mit

for (int i = 0; i < n; ++i) { ... } 

verwendet, wurde in einen der Kommentare bereits darauf hingewiesen:

Nach der ersten Iteration der Schleife, gleich mehr (*a)[i] nein 2. Verbleibende Iterationen tun nichts.

Ihre Funktion wird vereinfacht, wenn Sie vom Ende des Vektors iterieren und zurückgehen.

Übergeben Sie auch einen Verweis auf den Vektor anstelle eines Zeigers.

Hier ist ein komplettes Programm:

#include <vector> 
#include <iostream> 

void replace2(std::vector <int>& a, int n){ 
    for (int i = n-1; i >= 0; --i){ 
     if (a[i] == 2){ 
     a.erase(a.begin() + i); 
     for(int j = 0; j < 4; ++j){ 
      a.insert(a.begin() + i, 5); 
     } 
     } 
    } 
} 

int main() 
{ 
    std::vector<int> a{2, 2, 2}; 
    replace2(a, 3); 

    for(auto item : a) 
    { 
     std::cout << item; 
    } 

    std::cout << std::endl; 
} 

Sehen Sie es bei https://ideone.com/0Lip5j arbeiten.

Verwandte Themen