¿Hay una función de vector incorporada en C ++ para revertir un vector en su lugar?
¿O solo tienes que hacerlo manualmente?
¿Hay una función de vector incorporada en C ++ para revertir un vector en su lugar?
¿O solo tienes que hacerlo manualmente?
Respuestas:
Hay una función std::reverse
en el algorithm
encabezado para este propósito.
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a;
std::reverse(a.begin(), a.end());
return 0;
}
Todos los contenedores ofrecen una vista inversa de su contenido con rbegin()
y rend()
. Estas dos funciones devuelven iteradores inversos , que se pueden usar 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(), "<-");
}
Ejemplo en vivo en Ideone . Salida:
1->2->3->4->5
=============
5<-4<-3<-2<-1
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 mi experiencia de PC hoy como lo hizo hace 15 años, con la diferencia de que se desperdician aún más ciclos, miles de millones de ellos.
print_range
no es correcto: no funcionará cuando se pase el rango vacío .
std::reverse(a.rbegin(), a.rend())
? ; ^)
Puedes usar std::reverse
así
std::reverse(str.begin(), str.end());
También puedes usar en std::list
lugar de std::vector
. list
tiene una lista de funciones incorporada :: reverse para revertir elementos.
A menudo, la razón por la que desea invertir el vector es porque lo llena presionando 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
lugar y empujándolos directamente en el frente. (O bien, podría insertar los elementos en la parte delantera con vector::insert()
, pero eso sería lento cuando hay muchos elementos porque tiene que mezclar todos los demás elementos para cada inserción). Así que en lugar de:
std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());
En su lugar, puedes hacer:
std::deque<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_front(nextItem);
}
// No reverse needed - already in correct order
#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
}