C++11 删除循环中向量的最后一个元素时出现问题

C++11 删除循环中向量的最后一个元素时出现问题,c++11,vector,stl,runtime,erase,C++11,Vector,Stl,Runtime,Erase,在下面的代码中,如果我尝试删除除最后一个元素之外的任何元素,代码都可以正常工作。但若我试图删除最后一个元素,它会抛出运行时错误。不知道为什么 #include <iostream> #include <string> #include <vector> using namespace std; int main() { vector<string> s; s.push_back("Jacob"); s.push_back("

在下面的代码中,如果我尝试删除除最后一个元素之外的任何元素,代码都可以正常工作。但若我试图删除最后一个元素,它会抛出运行时错误。不知道为什么

#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;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
向量s;
s、 推回(“雅各布”);
s、 向后推(“Jamal”);
s、 推回(“约瑟夫”);
s、 推回(“Janardan”);
向量::迭代器;
for(it=s.begin();it!=s.end();it++)

cout它抛出运行时错误的原因是,您试图在删除最后一个元素后通过调用
it++
来增加迭代器。这会导致迭代器超出范围。解决此问题的更好方法是:

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

它引发运行时错误的原因是,您试图在删除最后一个元素后通过调用
it++
来增加迭代器。这会导致迭代器超出范围。解决此问题的更好方法是:

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

在your
std::vector
中有4个元素,因此循环将执行4次

问题是,删除元素时,删除元素后的所有迭代器都不再有效。这包括
it
,它指向一个不再存在的元素,因此它将抛出


您可以使用许多解决方案

  • 如果
    std::vector
    没有任何重复项,则可以在删除元素后
    中断

  • 如果

像这样

std::remove_if(std::begin(s), std::end(s), [](const auto& value) {
    return value == "Janardan";
});
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
  • 使用
    std::find
像这样

std::remove_if(std::begin(s), std::end(s), [](const auto& value) {
    return value == "Janardan";
});
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

在your
std::vector
中有4个元素,因此循环将执行4次

问题是,删除元素时,删除元素后的所有迭代器都不再有效。这包括
it
,它指向一个不再存在的元素,因此它将抛出


您可以使用许多解决方案

  • 如果
    std::vector
    没有任何重复项,则可以在删除元素后
    中断

  • 如果

像这样

std::remove_if(std::begin(s), std::end(s), [](const auto& value) {
    return value == "Janardan";
});
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
  • 使用
    std::find
像这样

std::remove_if(std::begin(s), std::end(s), [](const auto& value) {
    return value == "Janardan";
});
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