根据标准,std :: vector erase运算符的返回值是什么?

5

我更喜欢从源头获取信息,对于这种情况,ISO-IEC 14882是描述erase方法的地方,具体如下:

"iterator erase(const_iterator position);
iterator erase(const_iterator first, const_iterator last);

作用:使擦除点之后的迭代器和引用失效。

复杂度:T的析构函数被调用次数等于被擦除元素的数量,但T的移动赋值运算符被调用次数等于擦除元素之后向量中的元素数量。

异常:除非T的复制构造函数、移动构造函数、赋值运算符或移动赋值运算符抛出异常,否则不会抛出异常。"

无法找到有关返回迭代器的信息,当然,我搜索了一下,得到了以下结果:

一个指向函数调用后最后一个被擦除元素之后元素的新位置的迭代器

我不明白这在标准中是如何描述的。
你能告诉我吗?

更新:我的问题不是关于vector::erase如何工作的,
而是我们可以从标准中哪里推断出有关返回值的信息,因为我认为标准是可靠的信息来源。


1
你在文档中有没有遇到什么特别的问题? - πάντα ῥεῖ
1
我强烈建议不要将标准作为参考文档。只有在需要成为语言专家时才使用它。cppreference提供了很好的C++参考文档 - Justin
2
@spin_eight cppreference是一个知名的高质量参考网站。除非有证据证明其不可信,否则它是值得信赖的。 - Jesper Juhl
1
@spin_eight cppreference.com是一个非常可靠和知名的资源。信任它与信任“放在互联网上的任何东西”是完全不同的。我在cppreference.com上找到的编译器错误比错误更多。 - François Andrieux
1
@ChristopherPisz:无论人们为什么选择付费或不付费,它都是语言的定义(包括标准库),它肯定应该指定erase的返回类型。(正如我们可以从NathanOliver的回答中看到的那样。) - Keith Thompson
显示剩余9条评论
1个回答

16

这些信息的位置略有些不直观。函数 erase 的返回值详细说明在通用容器要求部分的序列容器一节中,具体来说是 [sequence.reqmts]/11

a.erase(q) 返回的迭代器指向被删除元素的后一个元素。如果不存在这样的元素,则返回 a.end()

以及 [sequence.reqmts]/12

a.erase(q1, q2) 返回的迭代器指向被删除元素的后一个元素。如果不存在这样的元素,则返回 a.end()


只是为了确保我理解正确:你的意思是:从a.erase(q)返回的迭代器指向在元素被删除之前紧随q后面的元素。如果不存在这样的元素,则返回a.end()。我的理解是:从a.erase(q)返回的迭代器指向紧随q后面的元素,然后删除q。如果不存在这样的元素,则返回a.end()。只是想学点东西... - Dr t
@Drt 返回的迭代器将指向被删除元素之后的元素。如果没有这样的元素(即删除了向量中的最后一个元素),则返回 end() - NathanOliver
请参考 https://dev59.com/-HRC5IYBdhLWcg3wSu97 中Dalle的回答,了解在循环中使用该方法的原因。 - Christopher Pisz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接