2012-01-16 32 views

Respuesta

193

Hay una función std::reverse en el encabezado algorithm para este propósito.

#include <vector> 
#include <algorithm> 

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

Acabo de agregar el espacio de nombres 'std', espero que no te importe;) ... – MartinStettner

+5

No, gracias. Acabo de notar sus ediciones y son absolutamente adecuadas y precisas. –

+0

¿Podría explicar cómo invertir el vector de vectores? Quiero que v [0] se intercambie con v [v.size() - 1] y que el orden del elemento v [0] [i] permanezca como está. Esto es similar a cambiar el orden de las filas (si un vector se ve como una matriz). Si un vector se define como: vector > v; reverse (v.begin(), v.end()) no lo invierte. TIA! –

16

Puede utilizar std::reverse como esto

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

Todos los contenedores ofrecen una vista invertido de su contenido con rbegin() y rend(). Estas dos funciones devuelven so-calles iteradores inversos, que se pueden utilizar como los normales, pero parecerá que el contenedor está realmente invertido.

#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. Salida:

1->2->3->4->5 
============= 
5<-4<-3<-2<-1 
+1

que, sin embargo, no invierte el vector en contexto. Puede crear un nuevo vector con std :: vector v2 (v1.rbegin(), v1.rend()); v2.swap (v1); que usaría efectivamente su solución. Sin embargo, no veo cómo es más elegante o ventajoso usar std :: reverse. – CashCow

+11

@CashCow: Bueno, para empezar, no es necesario, es O (1). Revertir ... no tanto. La mayoría de las veces, realmente no necesita un contenedor invertido, solo necesita * ver * como revertido. De hecho, no puedo pensar en una situación en la que realmente necesite un contenedor invertido que no pueda ser resuelto con iteradores inversos. – Xeo

+3

@CashCow: La elegancia no siempre es verdadera elegancia. En la mayoría de los casos en mi carrera profesional, solo necesitaba una vista invertida, pero no un vector invertido. Y en todos esos casos, el rendimiento sería totalmente innecesario si creara más copias o transformara el orden. ¿Sería usted también 'std :: sort' un vector de 1000 elementos, si solo necesita el top-10 en un orden no especificado, porque es más elegante que' std :: partition'? Esta es la escuela de pensamiento que paraliza la experiencia de mi PC hoy como lo hizo hace 15 años, con la diferencia de que aún se desperdician más ciclos, miles de millones de ellos. –

1

También se puede utilizar en lugar de std::liststd::vector. list tiene una función incorporada list::reverse para elementos de inversión.