C ++按值而不是按位置擦除向量元素?

时间:2010-08-02 05:27:36

标签: c++ vector stl erase erase-remove-idiom

vector<int> myVector;

并且假设向量中的值是这个(按此顺序):

5 9 2 8 0 7

如果我想删除包含值“8”的元素,我想我会这样做:

myVector.erase(myVector.begin()+4);

因为这会抹掉第4个元素。但有没有办法根据值“8”擦除元素?像:

myVector.eraseElementWhoseValueIs(8);

或者我只是需要遍历所有向量元素并测试它们的值?

4 个答案:

答案 0 :(得分:359)

std::remove()如何改为:

#include <algorithm>
...
vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());

此组合也称为erase-remove idiom

答案 1 :(得分:82)

您可以使用std::find获取值的迭代器:

#include <algorithm>
std::vector<int>::iterator position = std::find(myVector.begin(), myVector.end(), 8);
if (position != myVector.end()) // == myVector.end() means the element was not found
    myVector.erase(position);

答案 2 :(得分:11)

你不能直接这样做。您需要使用std::remove算法将要删除的元素移动到向量的末尾,然后使用erase函数。类似于:myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end());。有关详细信息,请参阅此erasing elements from vector

答案 3 :(得分:0)

Eric Niebler正在研究范围提案,而examples部分提示如何删除某些元素。删除8.是否创建新矢量。

#include <iostream>
#include <range/v3/all.hpp>

int main(int argc, char const *argv[])
{
    std::vector<int> vi{2,4,6,8,10};
    for (auto& i : vi) {
        std::cout << i << std::endl;
    }
    std::cout << "-----" << std::endl;
    std::vector<int> vim = vi | ranges::view::remove_if([](int i){return i == 8;});
    for (auto& i : vim) {
        std::cout << i << std::endl;
    }
    return 0;
}

输出

  

2
  4
  6
  8
  10个
  -----
  2
  4
  6
  10个