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
past-the-end-iterator传递给erase方法时会发生什么?标准是否说它是UB?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)
有什么想法吗?
Jam*_*lis 10
C++标准说erase(q1,q2)成员"擦除[q1,q2]范围内的元素"(参见第23.1.1节).由于范围不包括最后一个元素,
v.erase(v.end(), v.end());
Run Code Online (Sandbox Code Playgroud)
是有效的,没有删除.
| 归档时间: |
|
| 查看次数: |
1743 次 |
| 最近记录: |