使用
时,它是否正常(无效) vector<T> v;
v.erase(v.end());
我想使用像
这样的东西 v.erase(std::find(...));
我应该if
是v.end()
吗?
C++.com和CPPreference
答案 0 :(得分:24)
删除end()
(或者就此而言,甚至查看end()
的目标)是未定义的行为。允许未定义的行为具有任何行为,包括&#34;只是工作&#34;在你的平台上。这并不意味着你应该这样做;它仍然是未定义的行为,当你以后再次期待它时,我会以最坏的方式咬你。
根据您正在做的事情,您可能需要在此考虑set
或unordered_set
而不是vector
。
答案 1 :(得分:23)
该标准并未详细说明,但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
次操作。
答案 2 :(得分:5)
你试过这个吗?
v.erase(remove_if(v.begin(), v.end(), (<your criteria>)), v.end());