¿Cómo invierto un vector C++?

4 minutos de lectura

avatar de usuario
rodaja de dólar

¿Existe una función de vector integrada en C++ para invertir un vector en su lugar?

O solo tienes que hacerlo manualmente?

avatar de usuario
Ivailo Strandjev

hay una funcion std::reverse en el algorithm cabecera para este propósito.

#include <vector>
#include <algorithm>

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

  • ¿Podría explicar cómo invertir el vector de vectores? yo quiero v[0] para ser intercambiado con v[v.size()-1] y el orden de v[0][i] elemento permanece 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!

    – Vikas Goel

    14/01/2016 a las 20:30

  • @VikasGoel, de hecho, el fragmento que sugiere debería funcionar. ¿Quizás hay algún otro problema?

    – Ivailo Strandjev

    14/01/2016 a las 22:23

  • también puede mantener los elementos en orden inverso, pero luego iterar hacia atrás: for(auto i=a.end(); i!=a.begin();i–) {…} aunque eso puede ser complicado debido a errores de uno en uno. entonces usar rbegin() y rend() como otros sugieren es mejor

    – moe miedo

    18 de mayo a las 17:59

avatar de usuario
Xeo

Todos los contenedores ofrecen una inversión vista de su contenido con rbegin() y rend(). Estas dos funciones devuelven llamadas iteradores inversosque se pueden usar como los normales, pero parecerá que el contenedor está 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(), "<-");
}

Ejemplo en vivo en Ideone. Producción:

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

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

    – CashCow

    16 de enero de 2012 a las 10:45

  • @CashCow: Bueno, por un lado, no es operativo, es O (1). Marcha atrás.. no tanto. La mayoría de las veces, realmente no necesita un contenedor invertido, solo necesita ver como al revés. De hecho, no puedo pensar en una situación en la que realmente necesite un contenedor invertido que no pueda resolverse con iteradores inversos.

    – Xeo

    16 de enero de 2012 a las 10:54

  • @CashCow: La elegancia no siempre es la 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. ¿tú también std::sort un vector de 1000 elementos, si solo necesita los 10 principales en un orden no especificado, porque es más elegante que std::partition? Esta es la escuela de pensamiento que paraliza mi experiencia con la 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.

    – Sebastián Mach

    17 de enero de 2012 a las 12:04


  • print_range no es correcto: no funcionará cuando vacío se pasa el rango.

    – Nawaz

    5 de diciembre de 2013 a las 9:05


  • entonces la gran pregunta es, ¿qué std::reverse(a.rbegin(), a.rend()) ¿hacer? ;^)

    – Orwellófilo

    27 mayo 2019 a las 13:00

Puedes usar std::reverse como esto

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

A menudo, la razón por la que desea invertir el vector es porque lo llena empujando todos los elementos al final, pero en realidad los estaba recibiendo en orden inverso. En ese caso, puede invertir el contenedor a medida que avanza utilizando un deque en su lugar y empujándolos directamente en el frente. (O puede insertar los elementos en la parte delantera con vector::insert() en cambio, pero eso sería lento cuando hay muchos elementos porque tiene que barajar todos los demás elementos para cada inserción). Entonces, a diferencia de:

std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
    foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());

En su lugar, puede hacer:

std::deque<int> foo;
int nextItem;
while (getNext(nextItem)) {
    foo.push_front(nextItem);
}
// No reverse needed - already in correct order

avatar de usuario
hola w

También puedes usar std::list en vez de std::vector. list tiene una función incorporada lista::reverso para elementos de inversión.

  • std::list debe preferirse a vector en el único caso específico de insertar muchos elementos en posiciones arbitrarias en la secuencia. Usar std::list sobre vector solo porque invertirá la secuencia es una mala idea en cuanto al rendimiento.

    – eozd

    15 mayo 2018 a las 13:59

  • std::list debe preferirse a vector en el único caso específico de insertar muchos elementos en posiciones arbitrarias en la secuencia. Usar std::list sobre vector solo porque invertirá la secuencia es una mala idea en cuanto al rendimiento.

    – eozd

    15 mayo 2018 a las 13:59

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad