Décalage des éléments d'un tableau en C++
-
Utiliser l’algorithme
std::rotate
pour décaler les éléments d’un tableau en C++ -
Utiliser la fonction d’habillage personnalisé pour
std::rotate
pour décaler les éléments du tableau en C++ -
Utiliser l’algorithme
std::rotate_copy
pour décaler les éléments d’un tableau en C++
Cet article présente plusieurs méthodes permettant de déplacer des éléments du tableau en C++.
Utiliser l’algorithme std::rotate
pour décaler les éléments d’un tableau en C++
La fonction std::rotate
fait partie de la bibliothèque d’algorithmes C++ qui peut être importée en utilisant l’en-tête <algorithme>
. Cet algorithme fait tourner les éléments du tableau vers la gauche. Il prend trois paramètres de types d’itérateurs, dont le second spécifie l’élément qui doit être le premier élément de la plage nouvellement construite. Le premier et le troisième élément sont les spécificateurs de la plage source pour les positions de début et de fin.
Notez que std::rotate
peut être utilisé pour déplacer des éléments vers la droite en utilisant les itérateurs rbegin
/rend
. Dans l’exemple suivant, la fonction est appelée sur l’objet std::vector
avec 10 entiers, et les opérations pour les deux directions sont démontré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);
}
Production :
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
[ 4, 5, 6, 7, 8, 9, 10, 1, 2, 3 ]
Utiliser la fonction d’habillage personnalisé pour std::rotate
pour décaler les éléments du tableau en C++
Alternativement, nous pouvons implémenter la fonction wrapper pour encapsuler l’algorithme std::rotate
et demander à l’utilisateur de ne passer que 2 arguments - l’objet tableau à tourner et l’entier représentant le nombre de positions à décaler. Nous pouvons également indiquer le signe de l’entier passé comme la direction vers laquelle l’opération de rotation doit être traitée.
Dans cette fonction personnalisée, nous avons arbitrairement choisi l’entier positif pour signifier la rotation à droite et l’entier négatif pour signifier la rotation à gauche.
Notez que ce modèle de fonction rotateArrayElements
peut fonctionner à la fois sur des objets de type tableau fixe et dynamique construits avec les conteneurs de la bibliothèque standard 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);
}
Production :
[ 8, 9, 10, 1, 2, 3, 4, 5, 6, 7 ]
[ 4, 5, 6, 7, 8, 9, 10, 1, 2, 3 ]
Utiliser l’algorithme std::rotate_copy
pour décaler les éléments d’un tableau en C++
L’algorithme std::rotate_copy
implémente la même opération que l’algorithme std::rotate
sauf que le premier copie les éléments du tableau pivoté dans une autre plage spécifiée avec un paramètre de fonction supplémentaire.
Au début, nous devons déclarer la nouvelle plage, dans ce cas, le type std::vector
est choisi, et le constructeur prend la taille du vector
source.
Nous pouvons ensuite appeler la fonction rotate_copy
avec les mêmes paramètres que nous spécifions pour std::rotate
et le quatrième itérateur indiquant le début du vector
de destination.
Notez que l’exemple suivant ne montre que la rotation à gauche des éléments du tableau.
#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