如何反转C ++向量?


144

C ++中是否有内置矢量函数可以将矢量反向转换到位?

还是只需要手动进行?

Answers:


251

有一个功能,std::reversealgorithm用于此目的的头。

#include <vector>
#include <algorithm>

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

您能解释一下如何逆转向量吗?我希望将v [0]与v [v.size()-1]交换,并将v [0] [i]元素的顺序保持原样。这类似于更改行的顺序(如果将向量视为矩阵)。如果向量定义为:vector <vector <int>> v; reverse(v.begin(),v.end())不会反转它。TIA!
Vikas Goel

@VikasGoel实际上您建议的摘录应该起作用。也许还有其他问题?
Ivaylo Strandjev '16

45

所有容器提供了一个相反的观点其内容与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

1
但是,这不会使向量就地反转。您可以使用std :: vector <T> v2(v1.rbegin(),v1.rend())创建一个新向量。v2.swap(v1); 这将有效地使用您的解决方案。我看不出使用std :: reverse在任何方面如何更优雅或更有利。
CashCow 2012年

17
@CashCow:好吧,这是一个无人操作,是O(1)。倒车..不是很多。大多数时候,您实际上并不需要反向容器,只需要查看反向容器即可。实际上,我无法想到您实际上需要使用反向迭代器无法解决的反向容器的情况。
Xeo 2012年

4
@CashCow:优雅并不总是真正的优雅。在我职业生涯的大多数情况下,我只需要一个相反的观点,而不是一个相反的方向。在所有这些情况下,如果您创建更多副本或更改顺序,性能将完全不必要。std::sort如果只需要前10位以不确定的顺序排序,是否还会有一个1000元素的向量,因为它比优雅std::partition?这是一门思想流派,使我今天的PC体验像15年前一样受到损害,不同之处是浪费了更多的周期,其中数十亿周期被浪费掉了。
塞巴斯蒂安·马赫2012年

print_range是不正确的:当传递范围时,它将不起作用。
Nawaz 2013年

所以最大的问题是,怎么std::reverse(a.rbegin(), a.rend())办?; ^)
Orwellophile

23

您可以使用std::reverse这样的

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

5
两分钟的变化令人惊奇。
jww

2

您也可以使用std::list代替std::vectorlist有一个内置的功能list :: reverse用于反转元素。


3
在将许多元素插入序列中任意位置的唯一特定情况下,应优先选择std :: list而不是vector。在向量上使用std :: list只是因为您将颠倒序列,这在性能上是一个坏主意。
eozd

0

通常,您想反转向量的原因是因为您通过将所有项目推到最后来填充它,但实际上却以相反的顺序接收它们。在这种情况下,您可以通过使用a容器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

0
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
    vector<int>v1;
    for(int i=0; i<5; i++)
        v1.push_back(i*2);
    for(int i=0; i<v1.size(); i++)
        cout<<v1[i];    //02468
    reverse(v1.begin(),v1.end());
    
    for(int i=0; i<v1.size(); i++)
        cout<<v1[i];   //86420
}

1
这个八岁的问题是否需要另一个重复的答案而又不添加任何内容?
高炉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.