【问题标题】:Erasing particular elements in a vector with algorithm用算法擦除向量中的特定元素
【发布时间】:2016-11-06 18:19:41
【问题描述】:

我想弄清楚remove_ifvector<T>::erase 是如何工作的。我有下面的代码(试图删除奇数元素):

v2.clear();
v2 = { 10, 20, 21, 30, 31, 33, 44, 66, 67 }; //vector<int>
cout << "v2 is now: " << endl;
printCollection(v2);    
cout << "Trying to remove odds from v2: " << endl;
auto what = remove_if(begin(v2), end(v2), [](int elem) {return elem % 2 != 0;});
v2.erase(begin(v2), what);
printCollection(v2);

这是输出:

v2 is now:
10 20 21 30 31 33 44 66 67

Trying to remove odds from v2:
33 44 66 67

发生了什么事?

【问题讨论】:

    标签: c++ stdvector stl-algorithm


    【解决方案1】:

    您的代码的行为未指定。 std::remove_if 将所有未删除的元素移动到容器的前面并返回新的逻辑结束迭代器。这个新端(代码中的what)和.end() 之间的所有元素都有未指定的值。

    您应该改为从 what 擦除到 .end()

    v2.erase(what, end(v2));
    

    demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2011-10-23
      相关资源
      最近更新 更多