从向量中删除向量::end

问题描述 投票:0回答:3

我使用时它工作正常吗(什么都不做)

 vector<T> v;
 v.erase(v.end());

我想用类似的东西

 v.erase(std::find(...));

我应该

if
是不是
v.end()

C++.comCPPreference

上没有相关信息
c++ vector iterator language-lawyer erase
3个回答
42
投票

标准并没有完全说明这一点,但是

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
操作。


30
投票

擦除

end()
(或者就此而言,甚至查看
end()
的目标)是未定义的行为。未定义的行为允许有任何行为,包括在您的平台上“正常工作”。这并不意味着您应该这样做;而是意味着您应该这样做。这仍然是未定义的行为,稍后当你最意想不到的时候,我会以最糟糕的方式咬你。

根据您正在做什么,您可能需要考虑使用

set
unordered_set
而不是此处的
vector


7
投票

你尝试过这个吗?

v.erase(remove_if(v.begin(), v.end(), (<your criteria>)), v.end());
© www.soinside.com 2019 - 2024. All rights reserved.