std::advanced()导致无休止的循环
std::advance() causes endless loop
我有一个使用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的本质)。
相关文章:
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 关于 SIGTSTP 错误和无休止的输入
- 宽藤会话更新无休止循环
- 无字母循环
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 在图像上覆盖文本的程序会产生无休止的字符串错误
- OpenSSL客户端陷入无休止的读取
- 无休止的 do while 循环C++代码
- 循环无休止地做
- 卡死胡同-无休止的循环,没有解决方案
- C++:如果输入不是整数,为什么这段代码会运行一个无休止的循环
- C++无休止的循环瓶颈
- 这无休止地循环是否有明显的原因
- 静态分析工具,用于检测由于类型提升而导致的无休止循环
- c++:在修改c字符串数组时帮助纠正无休止循环
- std::advanced()导致无休止的循环
- 为什么我的函数无休止地循环
- 在无休止地循环cout时执行,忽略cin
- boost::asio系统的无休止循环:第一次连接后出现9个错误
- 我如何阻止它无休止地循环