我在阅读 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 方法。
- 当
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();
}
对此有什么想法吗?
最佳答案
我认为 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/