微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一种情况,我正在通过矢量,行事:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐