Elementos de Deslocamento em Array em C++
-
Utilizar
std::rotate
Algoritmo para Deslocar Elementos no Array em C++ -
Utilizar a função Wrapper Personalizada para
std::rodar
para Deslocar Elementos no Array em C++ -
Utilizar o
std::rotate_copy
Algoritmo 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