擦除-删除习语:当删除返回超过末尾的迭代器时会发生什么?
当我阅读 Scott Meyers erase-remove idiom(第 32 项)时,我遇到了这个问题="nofollow noreferrer">“有效的STL”书。
vector<int> v;
...
v.erase(remove(v.begin(), v.end(), 99), v.end());
remove
基本上返回“新逻辑结束”以及从该范围的“新逻辑结束”开始的原始范围的元素并继续,直到范围的真正末尾是要从容器中删除的元素。
听起来不错。现在,让我问我的问题:
在上面的例子中,如果在向量 v
remove 可以返回 v.end()
>。它基本上是将past-the-end-iterator
传递给erase方法。
- 将
past-the-end-iterator
传递给erase
方法时会发生什么?标准是否称其为 UB? - 如果这是未定义的行为,那么 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();
}
对此有什么想法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我认为 v.erase(v.end(), v.end()) 会被很好地定义并且不会删除任何内容。
I would think
v.erase(v.end(), v.end())
would be well defined and erase nothing.C++ 标准规定,
erase(q1,q2)
成员“擦除 [q1,q2) 范围内的元素”(参见第 23.1.1 节)。由于范围不包括最后一个元素,因此有效并且不会删除任何内容。
The C++ standard says that the
erase(q1,q2)
member "erases the elements in the range [q1,q2)" (cf. section 23.1.1). Since the range excludes the last element,is valid and erases nothing.
C++ 参考声明:
C++ Reference claims: