c++ - Erase-remove 习语 : what happens when remove return past-the-end-iterator?

标签 c++ stl erase erase-remove-idiom

我在阅读 Scott Meyers 的 erase-remove idiom(第 32 项)时遇到了这个问题 "Effective STL”书。

vector<int> v; 
...
v.erase(remove(v.begin(), v.end(), 99), v.end());

remove 基本上返回“新逻辑结束”和原始范围的元素,这些元素从范围的“新逻辑结束”开始并继续直到范围的真正结束是要删除的元素从容器中删除。

听起来不错。现在,让我问我的问题:

在上面的例子中,如果 vector v 中没有找到 99,remove 可以返回 v.end()。它基本上是将 past-the-end-iterator 传递给 erase 方法。

  1. past-the-end-iterator 被传递给 erase 方法时会发生什么?标准说它是 UB 吗?
  2. 如果是未定义的行为,那么 Scott Meyer 书中的erase-remove idiom 示例应该是这样的:

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

对此有什么想法吗?

最佳答案

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

关于c++ - Erase-remove 习语 : what happens when remove return past-the-end-iterator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1678366/

相关文章:

c++ - 初始化类的结构数据成员

c++ - 我应该如何处理 libpq for postgresql 中的错误

c - Scanf 不情愿地删除一个字符数组

c++ - 从特征矩阵中删除行

C++ map::find char * 与 char []

c++ - 包含存储在 vector 中的 auto_ptr 的类

c++ - 根据类私有(private)成员对包含类的列表进行排序

c++ - 使用 std::min_element() 时保存函数计算

python - 如何在使用后从文件中删除一行

c++ - QGraphicsScene/View 比例理解