我有一个使用std::advance()
的代码片段。
使用std::advance()
时如何避免无限循环?
std::list<xxx>::iterator i = ppp.begin();
std::advance(i, yyy);
最佳答案
也许您的意思是,应该如何避免运行通过end()迭代器。
在这种情况下,只需检查
std::advance(i, std::min(yyy, std::distance(i, ppp.end()));
或者,围绕std :: advance / std :: next编写包装器,以更高效地检查结束迭代器:http://ideone.com/7DYSSn
#include <list>
#include <cassert>
template <typename It>
It safe_next(It it, std::size_t steps, It end)
{
while (it!=end && steps--)
it++;
return it;
}
int main()
{
std::list<int> l { 1,2,3,4,5,6,7,8 };
auto it = begin(l);
assert(safe_next(it, 3, end(l)) == std::next(it, 3));
assert(safe_next(it, 30, end(l)) == end(l));
// the `distance` trick also works:
assert(next(it, std::min(30l, std::distance(it, end(l)))) == end(l));
}
请注意,最后运行的是不确定行为,这与无限循环完全不同。它可能具有相同的“表观”效果(当然,这就是UB的本质)。