加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读