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

时间:2018-09-12 18:05:35

标签: c++ c++11 vector syntax language-lawyer

我更喜欢从源头获取信息,在这种情况下,这是ISO-IEC 14882, 擦除方法描述如下:

  

“迭代器擦除(const_iterator位置);
  迭代器擦除(const_iterator首先,const_iterator最后);

     

效果:无效   擦除点或擦除点之后的迭代器和引用。

     

复杂度:T的析构函数称为次数等于   擦除的元素数,但移动分配运算符为   T称为与元素中元素数相等的次数   删除元素后的向量。

     

抛出:什么都没有,除非有异常   由复制构造函数,移动构造函数,赋值引发   运算符,或移动T的赋值运算符。”

找不到有关返回的迭代器的信息, 当然,我用Google搜索并得到:

  

一个迭代器,指向后面的元素的新位置   函数调用删除的最后一个元素

无法理解标准中的描述
你能指出我吗?

更新:我的问题不是关于vector::erase的工作方式,
但是我可以从标准的哪个位置开始,作为我可靠的信息来源,我们就可以推断出有关返回值的信息

2 个答案:

答案 0 :(得分:8)

该信息有点不直观。 erase返回的内容在“常规容器要求”部分的“序列容器”部分下进行了详细说明,尤其是[sequence.reqmts]/11

  

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

[sequence.reqmts]/12

  

a.erase(q1, q2)返回的迭代器在擦除任何元素之前指向q2指向的元素。如果不存在这样的元素,则返回a.end()

答案 1 :(得分:-3)

假设您有一个由4个元素组成的向量,并且有一个引用第二个元素的迭代器。如果现在在该迭代器上使用“擦除”,则“擦除”将返回一个迭代器,该迭代器引用的是第三个元素,即由于擦除而刚擦除的第二个元素,但现在为第二个元素。