2012-01-16 148 views

回答

193

为此,在algorithm标题中有一个函数std::reverse

#include <vector> 
#include <algorithm> 

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

我刚刚添加了'std'命名空间,希望您不要介意;)... – MartinStettner 2012-01-16 08:51:56

+5

不,谢谢。刚注意到你的编辑,他们绝对足够和准确。 – 2012-01-16 08:52:37

+0

你能解释如何反转向量的矢量?我希望v [0]与v [v.size() - 1]交换,并且v [0] [i]元素的顺序保持原样。这与行的更改顺序相似(如果向量被视为Matrix)。如果矢量被定义为:vector > v;反向(v.begin(),v.end())不会反转它。 TIA! – 2016-01-14 20:30:41

16

您可以使用std::reverse这样

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

所有容器提供的内容与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 
+1

,但它并不反过来在原地的载体。你可以使用std :: vector v2(v1.rbegin(),v1.rend())创建一个新的向量; v2.swap(V1);这将有效地使用您的解决方案。我不明白它是如何更优雅或有利于任何方式使用std :: reverse。 – CashCow 2012-01-16 10:45:48

+11

@CashCow:呃,其中之一是没有任何操作,它是O(1)。逆转..没有那么多。大多数情况下,你并不需要一个反转的容器,你只需要*将它看作是相反的。事实上,我无法想象你实际上需要一个反向容器的情况,而这个容器不能用反向迭代器解决。 – Xeo 2012-01-16 10:54:36

+3

@CashCow:优雅并不总是真正的优雅。在我职业生涯中的大多数情况下,我只是需要一个颠倒的看法,而不是一个颠倒的向量。在所有这些情况下,如果您要创建更多副本或转换排序,则性能将完全不必要。如果您只需要非特定顺序的前10位,您是否也会'std :: sort' 1000个元素向量,因为它比'std :: partition'更优雅?这是一种思想流派,与15年前相比,它削弱了我今天的PC体验,不同之处在于更多的周期被浪费了,其中有数十亿次。 – 2012-01-17 12:04:56

1

您还可以使用std::list而不是std::vectorlist具有用于倒转元素的内置功能list::reverse