如何反转一个C++向量?

iecba09b  于 2023-03-20  发布在  其他
关注(0)|答案(5)|浏览(161)

C++中是否有一个内置的向量函数来反转向量?
还是你必须手动操作?

oo7oh9g9

oo7oh9g91#

algorithm头文件中有一个函数std::reverse用于此目的。

#include <vector>
#include <algorithm>

int main() {
  std::vector<int> a;
  std::reverse(a.begin(), a.end());
  return 0;
}
jgwigjjp

jgwigjjp2#

所有的容器都提供了一个反向的内容视图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
yyyllmsg

yyyllmsg3#

可以像这样使用std::reverse

std::reverse(str.begin(), str.end());
zd287kbt

zd287kbt4#

通常你想要反转向量的原因是因为你填充它的方式是把所有的项都推到最后,但实际上是以相反的顺序接收它们的。在这种情况下,你可以使用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
vaj7vani

vaj7vani5#

也可以使用std::list代替std::vectorlist有一个内置函数list::reverse,用于反转元素。

相关问题