c – 使用迭代器走路和解散std :: vector最干净的方法是什么?

c – 使用迭代器走路和解散std :: vector最干净的方法是什么?,第1张

概述我有一种情况,我正在通过矢量,行事: 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.. 我有一种情况,我正在通过矢量,行事:

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最干净的方法是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1223435.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存