【问题标题】:issue in deleting last element of vector in a loop在循环中删除向量的最后一个元素的问题
【发布时间】:2016-04-30 04:10:36
【问题描述】:

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

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

【问题讨论】:

    标签: c++11 vector stl runtime erase


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-20
        • 2011-04-14
        • 2016-12-19
        • 1970-01-01
        • 2015-08-05
        • 2012-01-27
        相关资源
        最近更新 更多