我试图找出确定我是否在地图循环的最后一次迭代中的最佳方法,以便执行以下操作:
for (iter = someMap.begin(); iter != someMap.end(); ++iter) { bool last_iteration; // do something for all iterations if (!last_iteration) { // do something for all but the last iteration } }
似乎有几种方法可以做到这一点:随机访问迭代器,distance
函数等.规范方法是什么?
编辑:没有地图的随机访问迭代器!
典范?我不能声称,但我建议
final_iter = someMap.end(); --final_iter; if (iter != final_iter) ...
按照KTC的建议编辑纠正.(谢谢!有时候你走得太快,搞砸了最简单的事情......)
从C++ 11开始,你也可以使用std :: next()
for (auto iter = someMap.begin(); iter != someMap.end(); ++iter) { // do something for all iterations if (std::next(iter) != someMap.end()) { // do something for all but the last iteration } }
虽然问题是在不久前提出的,但我认为值得分享.
这似乎是最简单的:
bool last_iteration = iter == (--someMap.end());
如果您只想使用ForwardIterator,这应该有效:
for ( i = c.begin(); i != c.end(); ) { iterator cur = i++; // do something, using cur if ( i != c.end() ) { // do something using cur for all but the last iteration } }
修改了Mark Ransom,它实际上按预期工作.
finalIter = someMap.end(); --finalIter; if (iter != final_iter)
惊讶没有人提到它,但当然提升有一些东西;)
Boost.Next(和等效的Boost.Prior)
你的例子看起来像:
for (iter = someMap.begin(); iter != someMap.end(); ++iter) { // do something for all iterations if (boost::next(iter) != someMap.end()) { // do something for all but the last iteration } }