c – 使用迭代器走路和解散std :: vector最干净的方法是什么?
发布时间:2020-12-16 10:51:49 所属栏目:百科 来源:网络整理
导读:我有一种情况,我正在通过矢量,行事: 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
我有一种情况,我正在通过矢量,行事:
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(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |