vector<int> myVector;
假设向量中的值是这样的(按照此顺序):
5 9 2 8 0 7
如果我想删除包含值为“8”的元素,我认为我应该这样做:myVector.erase(myVector.begin()+4);
因为这样会删除第四个元素。但是否有基于值 "8" 删除元素的方法?例如:
myVector.eraseElementWhoseValueIs(8);
还是我只需要迭代所有向量元素并测试它们的值?
vector<int> myVector;
假设向量中的值是这样的(按照此顺序):
5 9 2 8 0 7
如果我想删除包含值为“8”的元素,我认为我应该这样做:myVector.erase(myVector.begin()+4);
因为这样会删除第四个元素。但是否有基于值 "8" 删除元素的方法?例如:
myVector.eraseElementWhoseValueIs(8);
还是我只需要迭代所有向量元素并测试它们的值?
可以考虑使用std::remove()
代替:
#include <algorithm>
...
vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());
这种组合也被称为擦除-移除惯用语。
remove()
的描述:它将所有不等于传入值的值移动到范围[begin, end)
的开头。使用你在问题中提供的例子,你将得到5, 9, 2, 0, 7, 7
。然而,由于remove()
返回新结尾的迭代器,如果需要的话,vec.erase()
可以删除过时的元素(即此处的第二个7
)。 - Georg Fritzsche您可以使用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);
position = myVector.begin()
,并将所有内容放在一个while(position != myVector.end())
循环中。 - subtleseekerxutility
中出现了 Error C2676 binary '==': 'action' does not define this operator or a conversion to a type acceptable to the predefined operator
错误。我尝试过的所有方法都无法解决这个问题。 - IOviSpot你不能直接这样做。你需要使用std::remove
算法将要删除的元素移动到向量的末尾,然后使用erase
函数。示例代码如下:myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.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
assert()
)”、“记录消息到std::cerr
”......甚至这些都不是穷尽所有可能。不,提问者需要说明错误处理策略,以及找不到匹配项是否算作错误。 - Ben Voigt