Elementos de Deslocamento em Array em C++

Jinku Hu 12 outubro 2023
  1. Utilizar std::rotate Algoritmo para Deslocar Elementos no Array em C++
  2. Utilizar a função Wrapper Personalizada para std::rodar para Deslocar Elementos no Array em C++
  3. Utilizar o std::rotate_copy Algoritmo para Elementos de Deslocamento em Array em C++
Elementos de Deslocamento em Array em C++

Este artigo irá introduzir vários métodos de como deslocar elementos do array em C++.

Utilizar std::rotate Algoritmo para Deslocar Elementos no Array em C++

A função std::rotate faz parte da biblioteca de algoritmos C++ que podem ser importados utilizando o cabeçalho <algorithm>. Este algoritmo faz rodar os elementos do array para o lado esquerdo. São necessários três parâmetros de tipos de iteradores, o segundo dos quais especifica o elemento que precisa de ser o primeiro elemento da gama recém-construída. Entretanto, o primeiro e o terceiro elementos são os especificadores da gama de fontes para as posições inicial e final.

Note-se que std::rotate pode ser utilizado para deslocar elementos para o lado direito utilizando os iteradores rbegin/rend. No exemplo seguinte, a função é chamada no objecto std::vector com 10 números inteiros, e são demonstradas operações para ambas as direcções.

#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);
}

Resultado:

[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
[ 4, 5, 6, 7, 8, 9, 10, 1, 2, 3 ]

Utilizar a função Wrapper Personalizada para std::rodar para Deslocar Elementos no Array em C++

Em alternativa, podemos implementar a função de invólucro para encapsular o algoritmo std::rotate e exigir que o utilizador passe apenas 2 argumentos - o objecto do array a rodar e o número inteiro que representa o número de posições a deslocar. Podemos também denotar o sinal do inteiro passado como a direcção para a qual a operação de rotação deve ser processada.

Nesta função habitual, escolhemos arbitrariamente o número inteiro positivo para significar a rotação direita e o negativo para significar a rotação esquerda.

Note-se que este modelo de função rotateArrayElements pode funcionar tanto em objectos de array fixa como dinâmica construídos com os recipientes da biblioteca padrão 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);
}

Resultado:

[ 8, 9, 10, 1, 2, 3, 4, 5, 6, 7 ]
[ 4, 5, 6, 7, 8, 9, 10, 1, 2, 3 ]

Utilizar o std::rotate_copy Algoritmo para Elementos de Deslocamento em Array em C++

O algoritmo std::rotate_copy implementa a mesma operação que o algoritmo std::rotate excepto que o primeiro copia os elementos do array rotativa para outra gama especificada com parâmetro de função adicional.

No início, precisamos de declarar a nova gama, neste caso, o tipo std::vector é escolhido, e o construtor toma o tamanho da fonte vector.

Podemos então chamar a função rotate_copy com os mesmos parâmetros que especificaríamos para std::rotate e o quarto iterador denotando o início do vector de destino.

Note que o exemplo seguinte apenas demonstra a rotação à esquerda dos elementos do 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

Artigo relacionado - C++ Array