std::vector::iterator iter = my_List.begin();for ( ; iter != my_List.end(); ++iter ){ if ( iter->doStuff() ) // returns true if successful,false o/w { // Keep going... } else { for ( ; iter != m_List.begin(); --iter ) // ...This won't work... { iter->undoStuff(); } }}
在正常情况下 – 假设一切顺利 – 我一直前进到my_List.end()并成功结束循环.
但是,如果在我做某事时出现问题,我希望能够撤消所有内容 – 基本上将我的步骤回溯到向量的开头,一次一个地以相反的顺序撤消所有内容.
我的问题是,当我到达my_List.begin()时 – 如嵌套for循环中所示 – 我还没有完成,因为我仍然需要在列表中的第一个元素上调用undoStuff().现在,我可以在循环之外进行最后的调用,但这看起来有点不洁净.
我看到它的方式,我只有在到达my_List.rend()时才会这样做.但是,我无法将std :: vector :: iterator与std :: vector :: reverse_iterator进行比较.
鉴于我正在尝试做什么,迭代器类型/循环组合的最佳选择是什么?
解决方法 虽然通过rbegin()和rend()使用反向迭代器很有效,但不幸的是我发现反向和非反向迭代器之间的转换往往很混乱.无论是否需要在转换之前或之后增加或减少,我都无法记住逻辑拼图练习.因此,我通常会避免转换.这是我可能编写错误处理循环的方式.请注意,我认为你不必为失败的迭代器调用undoStuff() – 毕竟,doStuff()表示它没有成功.
// handle the situation where `doStuff() Failed...// presumably you don't need to `undoStuff()` for the iterator that Failed// if you do,I'd just add it right here before the loop://// iter->undoStuff();while (iter != m_List.begin()) { --iter; iter->undoStuff();}总结
以上是内存溢出为你收集整理的c – 使用迭代器走路和解散std :: vector最干净的方法是什么?全部内容,希望文章能够帮你解决c – 使用迭代器走路和解散std :: vector最干净的方法是什么?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)