2016-04-30 40 views
0

在下面的代碼中,如果我嘗試刪除除最後一個元素之外的任何元素,代碼將正常工作。但是,如果我嘗試刪除最後一個元素,則會引發運行時錯誤。不知道爲什麼?在刪除循環中向量的最後一個元素時的問題

#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; 
} 

回答

1

它拋出一個運行時錯誤的原因是因爲你試圖通過調用it++你刪除了最後一個元素之後遞增迭代器。這會導致迭代器超出範圍。一個更好的辦法來解決,這將是:

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

裏有你的std::vector 4個元素,所以循環將執行4次。

問題是,當刪除一個元素時,之後的所有迭代器刪除的元素不再有效。這包括it,它指向一個不再存在的元素,所以它會拋出。


解決方法有很多,你可以使用

  • 如果std::vector沒有任何重複,你可以break擦除元素

  • 使用std::remove_if

像這樣

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

像這樣

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 
相關問題