我使用时它工作正常吗(什么都不做)
vector<T> v;
v.erase(v.end());
我想用类似的东西
v.erase(std::find(...));
我应该
if
是不是v.end()
?标准并没有完全说明这一点,但是
v.erase(q)
被定义为“擦除q
中由[sequence.reqmts]
指向的元素”。这意味着 q
实际上必须指向一个元素,而结束迭代器则不然。传入最终迭代器是未定义的行为。
不幸的是,你需要写:
auto it = std::find(...);
if (it != <the part of ... that specifies the end of the range searched>) {
v.erase(it);
}
当然,你可以定义:
template typename<Sequence, Iterator>
Iterator my_erase(Sequence &s, Iterator it) {
if (it == s.end()) return it;
return s.erase(it);
}
my_erase(v, std::find(v.begin(), v.end(), whatever));
关联容器上的 c.erase()
返回 void
,因此要将此模板推广到所有容器,您需要一些 -> decltype
操作。
擦除
end()
(或者就此而言,甚至查看end()
的目标)是未定义的行为。未定义的行为允许有任何行为,包括在您的平台上“正常工作”。这并不意味着您应该这样做;而是意味着您应该这样做。这仍然是未定义的行为,稍后当你最意想不到的时候,我会以最糟糕的方式咬你。
根据您正在做什么,您可能需要考虑使用
set
或 unordered_set
而不是此处的 vector
。
你尝试过这个吗?
v.erase(remove_if(v.begin(), v.end(), (<your criteria>)), v.end());