结束范围检查应该使用!=而不是<因为指针的顺序不能保证.
例:
for(it = list.begin(); it != list.end(); ++it)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
小智 7
其他几个:
将反向迭代器转换为基本迭代器,而不记住迭代器现在将是它指向的迭代器之外的一个元素.
尝试使用需要随机访问迭代器的算法以及集合和映射之类的迭代器.
使用非const迭代器编辑映射条目的键(这恰好构建在VS.Net上,但不会与GCC一起构建)
适当延续之后erase().
假设:
Container::iterator i = cont.begin(), iEnd = cont.end();
Run Code Online (Sandbox Code Playgroud)
例如std::map,这不是一个好主意:
for (; i != iEnd; ++i) {
if (i->second.eraseCondition()) {
cont.erase(i);
}
}
Run Code Online (Sandbox Code Playgroud)
这可行:
for (; i != iEnd; ) {
Container::iterator temp = i;
++temp;
if (i->second.eraseCondition()) {
cont.erase(i);
}
i = temp;
}
Run Code Online (Sandbox Code Playgroud)
这也是:
for (; i != iEnd; ) {
if (i->second.eraseCondition()) {
cont.erase(i++);
}
else {
++i;
}
}
Run Code Online (Sandbox Code Playgroud)
真的太多次,我不得不在一些生产代码中应用这些修复:(
| 归档时间: |
|
| 查看次数: |
1513 次 |
| 最近记录: |