擦除矢量::从矢量结束

时间:2012-03-06 19:01:06

标签: c++ vector iterator language-lawyer erase

使用

时,它是否正常(无效)
 vector<T> v;
 v.erase(v.end());

我想使用像

这样的东西
 v.erase(std::find(...));

我应该ifv.end()吗? C++.comCPPreference

上没有相关信息

3 个答案:

答案 0 :(得分:24)

删除end()(或者就此而言,甚至查看end()的目标)是未定义的行为。允许未定义的行为具有任何行为,包括&#34;只是工作&#34;在你的平台上。这并不意味着你应该这样做;它仍然是未定义的行为,当你以后再次期待它时,我会以最坏的方式咬你。

根据您正在做的事情,您可能需要在此考虑setunordered_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());