Desplazar elementos de un array en C++
-
Utilizar el algoritmo
std::rotate
para desplazar elementos en un array en C++ -
Utilizar la función envolvente personalizada para
std::rotate
para desplazar elementos en un array en C++ -
Utilizar el algoritmo
std::rotate_copy
para desplazar elementos de un array en C++
![Desplazar elementos de un array en C++](/img/Cpp/feature-image---shift-elements-in-array-cpp.webp)
Este artículo presenta varios métodos para desplazar elementos en un array en C++.
Utilizar el algoritmo std::rotate
para desplazar elementos en un array en C++
La función std::rotate
es parte de la biblioteca de algoritmos de C++ que puede ser importada usando la cabecera <algorithm>
. Este algoritmo rota los elementos del array hacia el lado izquierdo. Toma tres parámetros de tipo iterador, el segundo de los cuales especifica el elemento que debe ser el primero del rango recién construido. Mientras tanto, el primer y el tercer elemento son los especificadores de rango de origen para las posiciones de inicio y final.
Observe que std::rotate
puede utilizarse para desplazar elementos hacia la derecha utilizando los iteradores rbegin
/rend
. En el siguiente ejemplo, se llama a la función sobre el objeto std::vector
con 10 enteros, y se demuestran las operaciones para ambas direcciones.
#include <algorithm>
#include <array>
#include <iostream>
#include <vector>
using std::array;
using std::cout;
using std::endl;
using std::rotate;
using std::vector;
template <typename T>
void printElements(T &v) {
cout << "[ ";
for (const auto &item : v) {
cout << item << ", ";
}
cout << "\b\b ]" << endl;
}
int main() {
vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printElements(vec);
rotate(vec.begin(), vec.begin() + 3, vec.end());
printElements(vec);
rotate(vec.rbegin(), vec.rbegin() + 3, vec.rend());
exit(EXIT_SUCCESS);
}
Producción :
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
[ 4, 5, 6, 7, 8, 9, 10, 1, 2, 3 ]
Utilizar la función envolvente personalizada para std::rotate
para desplazar elementos en un array en C++
Alternativamente, podemos implementar la función envolvente para encapsular el algoritmo std::rotate
y requerir al usuario que pase sólo 2 argumentos - el objeto del array a rotar y el entero que representa el número de posiciones a desplazar. También podemos indicar el signo del entero pasado como la dirección hacia la que debe procesarse la operación de rotación.
En esta función personalizada, elegimos arbitrariamente el entero positivo para significar la rotación a la derecha y el negativo para significar la rotación a la izquierda.
Tenga en cuenta que esta plantilla de función rotateArrayElements
puede trabajar tanto en objetos de array fijos como dinámicos construidos con los contenedores de la biblioteca estándar de C++.
#include <algorithm>
#include <array>
#include <iostream>
#include <vector>
using std::array;
using std::cout;
using std::endl;
using std::rotate;
using std::vector;
template <typename T>
void printElements(T &v) {
cout << "[ ";
for (const auto &item : v) {
cout << item << ", ";
}
cout << "\b\b ]" << endl;
}
template <typename T>
int rotateArrayElements(T &v, int dir) {
if (dir > 0) {
rotate(v.rbegin(), v.rbegin() + dir, v.rend());
return 0;
} else if (dir < 0) {
rotate(v.begin(), v.begin() + abs(dir), v.end());
return 0;
} else {
return 1;
}
}
int main() {
array<int, 10> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
rotateArrayElements(arr, 3);
printElements(arr);
rotateArrayElements(vec, -3);
printElements(vec);
exit(EXIT_SUCCESS);
}
Producción :
[ 8, 9, 10, 1, 2, 3, 4, 5, 6, 7 ]
[ 4, 5, 6, 7, 8, 9, 10, 1, 2, 3 ]
Utilizar el algoritmo std::rotate_copy
para desplazar elementos de un array en C++
El algoritmo std::rotate_copy
implementa la misma operación que el algoritmo std::rotate
excepto que el primero copia los elementos rotados del array a otro rango especificado con un parámetro adicional de la función.
En primer lugar, tenemos que declarar el nuevo rango, en este caso, se elige el tipo std::vector
, y el constructor toma el tamaño del vector
de origen.
A continuación, podemos llamar a la función rotate_copy
con los mismos parámetros que especificaríamos para std::rotate
y el cuarto iterador que denota el comienzo del vector
de destino.
Fíjate en que el siguiente ejemplo sólo demuestra la rotación a la izquierda de los elementos del array.
#include <algorithm>
#include <array>
#include <iostream>
#include <vector>
using std::array;
using std::cout;
using std::endl;
using std::rotate;
using std::rotate_copy;
using std::vector;
template <typename T>
void printElements(T &v) {
cout << "[ ";
for (const auto &item : v) {
cout << item << ", ";
}
cout << "\b\b ]" << endl;
}
int main() {
vector<int> vec1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printElements(vec1);
vector<int> vec2(vec1.size());
rotate_copy(vec1.begin(), vec1.begin() + 3, vec1.end(), vec2.begin());
printElements(vec2);
exit(EXIT_SUCCESS);
}
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
[ 4, 5, 6, 7, 8, 9, 10, 1, 2, 3 ]
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook