Elementos de Deslocamento em Array em C++
- 
          
            Utilizar std::rotateAlgoritmo para Deslocar Elementos no Array em C++
- 
          
            Utilizar a função Wrapper Personalizada para std::rodarpara Deslocar Elementos no Array em C++
- 
          
            Utilizar o std::rotate_copyAlgoritmo para 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 ]
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