std :: advance()导致无限循环

时间:2013-06-20 15:05:05

标签: c++ stl iterator

我有一个使用std::advance()的代码片段。

使用std::advance()时如何避免无限循环?

std::list<xxx>::iterator i = ppp.begin();
std::advance(i, yyy);

1 个答案:

答案 0 :(得分:1)

也许你的意思是,你应该如何避免跑过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的本质)。