【发布时间】:2011-01-04 23:58:03
【问题描述】:
有什么方法可以检查迭代器(无论它来自向量、列表、双端队列...)是否(仍然)可取消引用,即尚未失效?
我一直在使用try-catch,但是有没有更直接的方法呢?
示例:(不起作用)
list<int> l;
for (i = 1; i<10; i++) {
l.push_back(i * 10);
}
itd = l.begin();
itd++;
if (something) {
l.erase(itd);
}
/* now, in other place.. check if it points to somewhere meaningful */
if (itd != l.end())
{
// blablabla
}
【问题讨论】:
-
在 C++ 中,当您只是修改迭代器而不使用值时,您应该始终更喜欢
++itd而不是itd++。 -
在看到您的新代码示例后,请注意 STL 擦除方法返回下一个迭代器,它是一个有效的迭代器(尽管它可能是结束迭代器)。因此,为了帮助保持 itd 有效,您可以这样做: if (something) { itd = l.erase(itd); }
-
另请注意,R Samuel Klatchko 建议始终更喜欢前增量 (++itd) 而不是后增量 (itd++) 的原因是效率。由于 2 个运算符的实现方式不同,预增量总是更快。它不仅是与之相关的迭代器,还包括任何可以前后递增的值。
-
注意:作为重复链接的问题已作为 this 问题的重复项(循环引用)关闭。
标签: c++ stl iterator dereference