我有对象的地图,我想迭代它并删除一些条目.
typedef std::map<A,B> MapT;
MapT m;
MapT::iterator it;
for(it = m.begin(); it != m.end(); it++ ) {
if( condition ) m.erase(it);
}
Run Code Online (Sandbox Code Playgroud)
我可以这样做吗?
在std::map迭代器的情况下,对擦除元素的引用无效[23.1.2/8].您的代码在失效后使用迭代器,这会导致未定义的行为.为了避免这种未定义的行为,迭代器需要在调用中失效之前递增erase().
你需要使用:
for(it = m.begin(); it != m.end(); ) {
if( condition )
m.erase(it++);
else
++it;
}
Run Code Online (Sandbox Code Playgroud)
请注意,此处it++递增it以使其引用下一个元素,但会生成其原始值的副本.因此,it不引用erase()被调用时被删除的元素.
| 归档时间: |
|
| 查看次数: |
445 次 |
| 最近记录: |