vector<int> myVector;
假设向量中的值是这样的(按照这个顺序) :
5 9 2 8 0 7
如果我想删除包含“8”值的元素,我想我会这样做:
myVector.erase(myVector.begin()+4);
因为那会抹去第四元素。但是有没有办法根据值“8”来删除一个元素呢?比如:
myVector.eraseElementWhoseValueIs(8);
还是仅仅需要遍历所有向量元素并测试它们的值?
你不能直接这么做。你需要使用std::remove算法将要擦除的元素移动到向量的末尾,然后使用erase函数。类似myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end());。更多细节请参见从向量中删除元素。
std::remove
erase
myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end());
你可以使用std::find来获取一个值的迭代器:
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::remove()代替怎么样:
std::remove()
#include <algorithm> ... vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());
这个组合也被称为erase-remove成语。
Eric Niebler正在研究一个范围提案,其中一些例子说明了如何删除某些元素。删除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; }
输出
< p > 2 4 6 8 10 —— 2 4 6 10 < / p >