Décalage des éléments d'un tableau en C++

Jinku Hu 12 octobre 2023
  1. Utiliser l’algorithme std::rotate pour décaler les éléments d’un tableau en C++
  2. Utiliser la fonction d’habillage personnalisé pour std::rotate pour décaler les éléments du tableau en C++
  3. Utiliser l’algorithme std::rotate_copy pour décaler les éléments d’un tableau en C++
Décalage des é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 ]
Auteur: 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

Article connexe - C++ Array