Desplazar elementos de un array en C++

Jinku Hu 12 octubre 2023
  1. Utilizar el algoritmo std::rotate para desplazar elementos en un array en C++
  2. Utilizar la función envolvente personalizada para std::rotate para desplazar elementos en un array en C++
  3. Utilizar el algoritmo std::rotate_copy para desplazar elementos de un array en C++
Desplazar elementos de un array en C++

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 ]
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C++ Array