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

时间:2014-04-15 20:25:05

标签: c++ loops boost iterator reverse

我必须向前或向后处理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];
    ...
}

有更好的方法吗?

4 个答案:

答案 0 :(得分:7)

添加一个与前向迭代器或反向迭代器一起使用的模板函数。根据{{​​1}}的值使用适当的迭代器调用函数。

undoing

答案 1 :(得分: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);
}

答案 2 :(得分:3)

如何保持循环运行,因为它从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];
}

答案 3 :(得分:3)

您也可以使用基于Boost.Range的解决方案。它与已经提出的使用STL算法的算法类似。

#include <boost/range/adaptor/reversed.hpp>
#include <boost/range/algorithm/for_each.hpp>

// In C++11 lambda expression can be used instead
struct my_fun
{
    void operator()(const CType& elem) const
    {
        /*...*/
    }
};

/*...*/

using namespace boost::adaptors;

if ( iterate_forward )
    boost::for_each(my_vect, my_fun());
else
    boost::for_each(my_vect | reversed, my_fun());