在下面的代码中,如果我尝试删除除上一个元素之外的任何元素,代码工作正常。但是,如果我尝试删除最后一个元素,它会抛出运行时错误。不确定为什么?
#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;
}
答案 0 :(得分:1)
它抛出运行时错误的原因是因为您在删除最后一个元素后通过调用it++
来尝试增加迭代器。这导致迭代器超出范围。解决这个问题的更好方法是:
for(it = s.begin(); it != s.end();) {
if(*it == "Janardan") {
it = s.erase(it);
} else {
it++;
}
}
答案 1 :(得分: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