优雅的方式有条件地向前或逆转迭代

Cla*_*diu 4 c++ reverse boost iterator loops

我必须处理std::vector前进或后退,具体取决于布尔标志.实现这一目标最优雅的方法是什么?在需要反向做之前,我有:

BOOST_FOREACH(const CType &foo, vec) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,现在我看起来很可怕:

for (int i=undoing ? (vec.size()-1) : 0; undoing ? (i >= 0) : (i < vec.size()); undoing ? (i--) : (i++)) {
    const CType &foo = vec[i];
    ...
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

R S*_*ahu 7

添加一个与前向迭代器或反向迭代器一起使用的模板函数.使用适当的迭代器根据值调用函数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());
}
Run Code Online (Sandbox Code Playgroud)


Max*_*ert 6

我不知道人们会称之为优雅,但有:

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,我同意它更好.您应该尽可能使用STL算法.当然lambda表达式可以用一元函数替换,以便与C++ 98编译器一起使用. (2认同)

小智 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];
}
Run Code Online (Sandbox Code Playgroud)