在c++中是否有一个内置的向量函数来反转一个向量?
还是需要手动操作?
在c++中是否有一个内置的向量函数来反转一个向量?
还是需要手动操作?
在算法头中有一个std::reverse函数用于此目的。
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a;
std::reverse(a.begin(), a.end());
return 0;
}
所有容器都通过rbegin()和rend()提供其内容的反向视图。这两个函数返回所谓的反向迭代器,可以像普通迭代器一样使用,但看起来容器实际上是反向的。
#include <vector>
#include <iostream>
template<class InIt>
void print_range(InIt first, InIt last, char const* delim = "\n"){
--last;
for(; first != last; ++first){
std::cout << *first << delim;
}
std::cout << *first;
}
int main(){
int a[] = { 1, 2, 3, 4, 5 };
std::vector<int> v(a, a+5);
print_range(v.begin(), v.end(), "->");
std::cout << "\n=============\n";
print_range(v.rbegin(), v.rend(), "<-");
}
Ideone上的实例。输出:
1->2->3->4->5
=============
5<-4<-3<-2<-1
通常情况下,你想要反转向量的原因是因为你把所有的项都压在最后,但实际上是按相反的顺序接收它们。在这种情况下,你可以通过使用deque来反向容器,并直接将它们推到前面。(或者你可以用vector::insert()插入前面的项,但当有很多项时,这会很慢,因为每次插入都必须打乱所有其他项。)所以相对于:
std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());
你可以这样做:
std::deque<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_front(nextItem);
}
// No reverse needed - already in correct order