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

C++ Erase vector element by value rather than by position?

本问题已经有最佳答案,请猛点这里访问。

字母名称(P)And lets say the values in the vector are this(in this order):(p)字母名称(P)如果我想得到的是包含"8"价值的要素,我想我会这样做:(p)字母名称(P)因为这将是第四次选举。但是,是否有任何途径可以通过排除"8"的价值来实现这一点?Like:(p)字母名称(P)还是我只是需要反复使用所有向量要素和测试它们的价值?(p)


std::remove()代替:

1
2
3
#include
...
vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());

这种组合也称为"删除"习语。


您可以使用std::find将迭代器获取到一个值:

1
2
3
4
#include
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);


你不能直接这么做。您需要使用std::remove算法将要删除的元素移动到向量的末尾,然后使用erase函数。比如:myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end());。有关更多详细信息,请参见从向量中删除元素。


EricNiebler正在研究一个范围建议,其中一些示例演示了如何删除某些元素。去除8。创建一个新的向量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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