当前位置:  开发笔记 > 编程语言 > 正文

如何通过std :: map检测循环中的最后一次迭代?

如何解决《如何通过std::map检测循环中的最后一次迭代?》经验,为你挑选了6个好方法。

我试图找出确定我是否在地图循环的最后一次迭代中的最佳方法,以便执行以下操作:

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函数等.规范方法是什么?

编辑:没有地图的随机访问迭代器!



1> Mark Ransom..:

典范?我不能声称,但我建议

final_iter = someMap.end();
--final_iter;
if (iter != final_iter) ...

按照KTC的建议编辑纠正.(谢谢!有时候你走得太快,搞砸了最简单的事情......)


你可以只比较rbegin()的值
@ffpf,你不能因为前向迭代器和反向迭代器之间的比较不起作用.
除非地图在循环内发生变化,否则应在其外部评估final_iter.在这种情况下,必须检查地图是否空虚,以免我们遇到恐惧的未定义行为.

2> 小智..:

从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
        }
    }

虽然问题是在不久前提出的,但我认为值得分享.



3> Torlack..:

这似乎是最简单的:

bool last_iteration = iter == (--someMap.end());



4> camh..:

如果您只想使用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
        }
}



5> KTC..:

修改了Mark Ransom,它实际上按预期工作.

finalIter = someMap.end();
--finalIter;
if (iter != final_iter)



6> Pieter..:

惊讶没有人提到它,但当然提升有一些东西;)

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
    }
}

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有