vector<int> myVector;
假设向量中的值是这样的(按这个顺序):
5 9 2 8 0 7
如果我想删除包含“8”值的元素,我想我会这样做:
myVector.erase(myVector.begin()+4);
因为这会把第4个元素擦掉。但是有什么方法可以擦除基于值“8”的元素吗?如:
myVector.eraseElementWhoseValueIs(8);
或者我只是需要遍历所有向量元素并测试它们的值?
vector<int> myVector;
假设向量中的值是这样的(按这个顺序):
5 9 2 8 0 7
如果我想删除包含“8”值的元素,我想我会这样做:
myVector.erase(myVector.begin()+4);
因为这会把第4个元素擦掉。但是有什么方法可以擦除基于值“8”的元素吗?如:
myVector.eraseElementWhoseValueIs(8);
或者我只是需要遍历所有向量元素并测试它们的值?
当前回答
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;
}
输出
2 4 6 8 10 ----- 2 4 6 10
其他回答
你可以使用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算法将要擦除的元素移动到向量的末尾,然后使用擦除函数。比如:myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVector.end());;有关更多细节,请参见从vector中擦除元素。
用std::remove()来代替:
#include <algorithm>
...
vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());
这种组合也称为擦除-删除成语。
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;
}
输出
2 4 6 8 10 ----- 2 4 6 10