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

vector<int> myVector; 

并可以说vector中的值是这个(按此顺序):

 5 9 2 8 0 7 

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

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

因为那会消除第四个元素。 但是有什么办法可以根据值“8”来删除一个元素吗? 喜欢:

 myVector.eraseElementWhoseValueIs(8); 

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

怎么样std::remove()而不是:

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

这个组合也被称为删除成语 。

你可以使用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); 

你不能直接这样做。 您需要使用std::removealgorithm将要擦除的元素移动到向量的末尾,然后使用erasefunction。 例如: myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end()); 。 从vector中看到这个擦除元素的更多细节。

埃里克·尼布勒(Eric Niebler)正在制定一个范围提案,其中一些例子展示了如何删除某些元素。 删除8.是否创build一个新的向量。

 #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