我想在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++输出不同的错误,并且似乎对CCD_ 5的返回值使用不同的类型。
不确定是否更好,您将接受没有std::迭代器的解决方案,但我认为这稍微更优雅:
#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;
}
}
效率不是很高,因为你必须在每个循环中检查。