擦除删除习惯用法:删除返回结束迭代器时会发生什么?

aJ.*_*aJ. 3 c++ stl erase erase-remove-idiom

当我erase-remove idiom从Scott Meyers的"Effective STL"一书中读到(第32项)时,我得到了这个问题.

vector<int> v; 
...
v.erase(remove(v.begin(), v.end(), 99), v.end());
Run Code Online (Sandbox Code Playgroud)

remove 基本上返回"新逻辑结束"和原始范围的元素,从元素的"新逻辑结束"开始并继续,直到范围的实际结束是要从容器中删除的元素.

听起来不错.现在,让我问一下我的问题:

在上面的例子中,如果没有找到99就remove可以返回.它基本上是通过擦除方法.v.end()vector vpast-the-end-iterator

  1. past-the-end-iterator传递给erase方法时会发生什么?标准是否说它是UB?
  2. 如果它是未定义的行为,那么erase-remove idiomScott Meyer的书中的示例应该看起来像:

  vector<int> v; 
    ...
    vector<int>::iterator newEndIter = remove(v.begin(), v.end(), 99);
    if(newEndIter != v.end() )
    {
     v.erase(newEndIter, v.end();
    }  
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

Kei*_*all 10

我认为v.erase(v.end(), v.end())会很好地定义并且不会删除任何内容.


Jam*_*lis 10

C++标准说erase(q1,q2)成员"擦除[q1,q2]范围内的元素"(参见第23.1.1节).由于范围不包括最后一个元素,

v.erase(v.end(), v.end());
Run Code Online (Sandbox Code Playgroud)

是有效的,没有删除.

  • 真?我有数学学位,但老实说,我一直认为这个符号是众所周知的. (2认同)