迭代器还是reverse_iterator的一个变量?

时间:2018-07-26 17:56:11

标签: c++ for-loop iterator stdvector reverse-iterator

我想在for循环中迭代某些std::vector,但根据某些条件,向量应向前或向后迭代。我想,我可以通过使用普通的迭代器或反向迭代器轻松地做到这一点:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> vec{0, 1, 2, 3, 5, 6, 7};
    bool reverse = true;
    std::iterator<random_access_iterator_tag, int> it, end_it;

    if (reverse) {
      it = vec.rbegin();
      end_it = vec.rend();
    } else {
      it = vec.begin();
      end_it = vec.end();
    }

    for (; it != end_it; it++) {
        cout << *it << ", ";
    }
    return 0;
}

但是不幸的是vector::begin()vector::rbegin()似乎并没有使用相同的父类。在if-else结构中没有两个不同的循环的情况下,还有另一种方法可以做我想要的事情吗?当然,我可以为循环体创建一个函数/ lambda或使用一些索引算法,但是还有更优雅的方法吗?

编译器抱怨分配it = vec.begin()是不同的类型。 gcc和VC ++输出不同的错误,并且似乎为vector::begin的返回值使用了不同的类型。

1 个答案:

答案 0 :(得分:-1)

不确定是否会更好,您是否会接受不带std :: iterator的解决方案,但我认为这稍微更优雅:

#include <iostream>
#include <vector>

using namespace std;

int main() {
vector<int> vec{0, 1, 2, 3, 4, 5, 6};
bool reverse = true;

for(int i: vec){
    if(reverse) 
        cout << vec[vec.size()-i] << endl;
    else 
        cout << vec[i] << endl;
  }
}

效率不高,因为您必须检查是否在每个循环中。