我必须向前或向后处理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];
...
}
有更好的方法吗?
答案 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());