2016-04-30 24 views
0

In den folgenden Code, wenn ich versuche, ein Element mit Ausnahme der letzten zu entfernen, funktioniert der Code gut. Aber wenn ich versuche, das letzte Element zu löschen, gibt es einen Laufzeitfehler aus. Nicht sicher warum ?Problem beim Löschen der letzten Element des Vektors in einer Schleife

#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 
int main() 
{ 
    vector<string> s; 
    s.push_back("Jacob"); 
    s.push_back("Jamal"); 
    s.push_back("Joseph"); 
    s.push_back("Janardan"); 
    vector<string>::iterator it; 

    for(it = s.begin(); it != s.end() ; it++) 
     cout<<*it<<endl; 

    for(it = s.begin(); it != s.end() ; it++) 
     if(*it == "Janardan") 
      s.erase(it); 

    for(it = s.begin(); it != s.end() ; it++) 
     cout<<*it<<endl; 

    return 0; 
} 

Antwort

1

Der Grund ist es einen Laufzeitfehler führt, weil Sie versuchen, den Iterator zu erhöhen, indem it++ Aufruf, nachdem Sie das letzte Element gelöscht hat. Dies führt dazu, dass der Iterator außer Reichweite gerät. Eine bessere Art zu lösen, dies wäre:

for(it = s.begin(); it != s.end();) { 
    if(*it == "Janardan") { 
     it = s.erase(it); 
    } else { 
     it++; 
    } 
} 
1

Es gibt 4 Elemente in der Ihr std::vector, so dass die Schleife 4-mal ausgeführt wird.

Das Problem ist, wenn Sie ein Element löschen, alle Iteratoren nach die gelöschten Elemente sind nicht mehr gültig. Das schließt it ein, das auf ein Element verweist, das nicht mehr existiert, und so wird es werfen.


Es gibt viele Lösungen, die Sie

  • verwenden können, wenn die std::vector keine Duplikate hat, konnte man break nach ein Element

  • Verwenden Löschen std::remove_if

So wie

std::remove_if(std::begin(s), std::end(s), [](const auto& value) { 
    return value == "Janardan"; 
}); 
  • Verwenden std::find

Wie so

auto iterator = std::begin(s); //Initialize iterator to the first element 

//std::find returns std::end(s) if it didn't find anything 
if ((iterator = std::find(std::begin(s), std::end(s), "Janardan")) != std::end(s)) 
    s.erase(iterator); //Erase element