Cla*_*diu 4 c++ reverse boost iterator loops
我必须处理std::vector前进或后退,具体取决于布尔标志.实现这一目标最优雅的方法是什么?在需要反向做之前,我有:
BOOST_FOREACH(const CType &foo, vec) {
    ...
}
但是,现在我看起来很可怕:
for (int i=undoing ? (vec.size()-1) : 0; undoing ? (i >= 0) : (i < vec.size()); undoing ? (i--) : (i++)) {
    const CType &foo = vec[i];
    ...
}
有没有更好的办法?
添加一个与前向迭代器或反向迭代器一起使用的模板函数.使用适当的迭代器根据值调用函数undoing.
template <typename Iterator>
void doStuff(Iterator iter, Iterator end)
{
   for ( ; iter != end; ++iter )
   {
      // Do stuff
   }
}
if ( undoing )
{
   doStuff(vec.rbegin(), vec.rend());
}
else
{
   doStuff(vec.begin(), vec.end());
}
我不知道人们会称之为优雅,但有:
auto do_it = [](const CType& elem)
             {
                 ...
             };
if (iterate_forward) {
    std::for_each(vec.begin(), vec.end(), do_it);
}
else {
    std::for_each(vec.rbegin(), vec.rend(), do_it);
}
小智 5
如何保持循环从 0 到 vector.size 运行,但按照您需要的方向读取数组。
int idx;
for (int i =0; i < vec.size(); i ++)
{
   if (undoing) // assuming going forward
     idx = i;
   else // going backwards
     idx = vec.size() - i - 1;
  const CType &foo = vec[idx];
}