C++中是否有一个内置的向量函数来反转向量?还是你必须手动操作?
oo7oh9g91#
algorithm头文件中有一个函数std::reverse用于此目的。
algorithm
std::reverse
#include <vector> #include <algorithm> int main() { std::vector<int> a; std::reverse(a.begin(), a.end()); return 0; }
jgwigjjp2#
所有的容器都提供了一个反向的内容视图rbegin()和rend(),这两个函数返回所谓的反向迭代器,可以像普通的迭代器一样使用,但是看起来容器实际上是反向的。
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(), "<-"); }
Live example on Ideone。输出:
1->2->3->4->5 ============= 5<-4<-3<-2<-1
yyyllmsg3#
可以像这样使用std::reverse
std::reverse(str.begin(), str.end());
zd287kbt4#
通常你想要反转向量的原因是因为你填充它的方式是把所有的项都推到最后,但实际上是以相反的顺序接收它们的。在这种情况下,你可以使用deque来反转容器,直接把它们推到前面。(或者你可以使用vector::insert()在前面插入项目,但是当项目很多时,这样做会很慢,因为每次插入时都必须将所有其他项目混在沿着。)因此,与之相反:
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
vaj7vani5#
也可以使用std::list代替std::vector。list有一个内置函数list::reverse,用于反转元素。
std::list
std::vector
list
5条答案
按热度按时间oo7oh9g91#
algorithm
头文件中有一个函数std::reverse
用于此目的。jgwigjjp2#
所有的容器都提供了一个反向的内容视图
rbegin()
和rend()
,这两个函数返回所谓的反向迭代器,可以像普通的迭代器一样使用,但是看起来容器实际上是反向的。Live example on Ideone。输出:
yyyllmsg3#
可以像这样使用
std::reverse
zd287kbt4#
通常你想要反转向量的原因是因为你填充它的方式是把所有的项都推到最后,但实际上是以相反的顺序接收它们的。在这种情况下,你可以使用
deque
来反转容器,直接把它们推到前面。(或者你可以使用vector::insert()
在前面插入项目,但是当项目很多时,这样做会很慢,因为每次插入时都必须将所有其他项目混在沿着。)因此,与之相反:您可以改为:
vaj7vani5#
也可以使用
std::list
代替std::vector
。list
有一个内置函数list::reverse,用于反转元素。