Mélange de vecteurs en C++
-
Utiliser l’algorithme de
shuffle
pour mélanger des éléments vectoriels -
Utiliser l’algorithme
random_shuffle
pour mélanger des éléments vectoriels
Cet article présente plusieurs méthodes pour mélanger des éléments vectoriels en C++.
Utiliser l’algorithme de shuffle
pour mélanger des éléments vectoriels
La fonction std::shuffle
fait partie de la bibliothèque C++ <algorithm>
et implémente la fonction de permutation aléatoire, qui peut être appliquée aux éléments de la gamme donnée. La fonction prend les itérateurs de plage comme les deux premiers arguments et le générateur de nombres aléatoires comme le troisième. Un générateur de nombres aléatoires est un objet de fonction. Le C++ contemporain recommande d’utiliser les utilitaires standard de la bibliothèque de génération de nombres aléatoires. Il faut utiliser std::random_device
pour la génération de nombres non déterministes.
Enfin, l’objet moteur de nombres aléatoires choisi doit être créé et passé à l’algorithme shuffle
pour générer une permutation aléatoire de la plage. Notez que nous imprimons un vecteur d’entiers avant et après que la permutation ait été effectuée.
#include <algorithm>
#include <iostream>
#include <random>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::shuffle;
using std::string;
using std::vector;
template <typename T>
void printVectorElements(vector<T> &vec) {
for (auto i = 0; i < vec.size(); ++i) {
cout << vec.at(i) << "; ";
}
cout << endl;
}
int main() {
vector<int> i_vec1 = {12, 32, 43, 53, 23, 65, 84};
cout << "i_vec1 : ";
printVectorElements(i_vec1);
std::random_device rd;
std::default_random_engine rng(rd());
shuffle(i_vec1.begin(), i_vec1.end(), rng);
cout << "i_vec1 (shuffled): ";
printVectorElements(i_vec1);
cout << endl;
return EXIT_SUCCESS;
}
Production :
i_vec1 : 12; 32; 43; 53; 23; 65; 84;
i_vec1 (shuffled): 53; 32; 84; 23; 12; 43; 65;
Comme alternative à la méthode précédente, on peut implémenter la même sous-routine en utilisant les objets std::begin
et std::end
pour passer les itérateurs de plage à la fonction shuffle
. L’exemple suivant pourrait être une version plus générique pour des scénarios de codage spécifiques.
#include <algorithm>
#include <iostream>
#include <random>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::shuffle;
using std::string;
using std::vector;
template <typename T>
void printVectorElements(vector<T> &vec) {
for (auto i = 0; i < vec.size(); ++i) {
cout << vec.at(i) << "; ";
}
cout << endl;
}
int main() {
vector<int> i_vec1 = {12, 32, 43, 53, 23, 65, 84};
cout << "i_vec1 : ";
printVectorElements(i_vec1);
std::random_device rd;
std::default_random_engine rng(rd());
shuffle(std::begin(i_vec1), std::end(i_vec1), rng);
cout << "i_vec1 (shuffled): ";
printVectorElements(i_vec1);
cout << endl;
return EXIT_SUCCESS;
}
Production :
i_vec1 : 12; 32; 43; 53; 23; 65; 84;
i_vec1 (shuffled): 43; 23; 32; 65; 53; 12; 84;
Utiliser l’algorithme random_shuffle
pour mélanger des éléments vectoriels
std::random_shuffle
est un autre algorithme utilitaire de la bibliothèque standard C++. L’ancienne version de std::shuffle
a été dépréciée pour les derniers standards C++. Bien qu’elle puisse être utilisée dans des environnements de codage plus anciens où des versions C++ plus anciennes sont disponibles.
Le random_shuffle
peut prendre un générateur de nombres aléatoires fourni par l’utilisateur, mais comme les anciennes versions du C++ ne disposaient pas de la bibliothèque aléatoire, on ne peut fournir que des itérateurs de plage à la fonction. Dans ce dernier cas, random_shuffle
utilise un générateur de nombres aléatoires défini par l’implémentation, qui se trouve parfois être l’appel de fonction std::rand
.
#include <algorithm>
#include <iostream>
#include <random>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::shuffle;
using std::string;
using std::vector;
template <typename T>
void printVectorElements(vector<T> &vec) {
for (auto i = 0; i < vec.size(); ++i) {
cout << vec.at(i) << "; ";
}
cout << endl;
}
int main() {
vector<int> i_vec1 = {12, 32, 43, 53, 23, 65, 84};
cout << "i_vec1 : ";
printVectorElements(i_vec1);
std::random_shuffle(i_vec1.begin(), i_vec1.end());
cout << "i_vec1 (shuffled): ";
printVectorElements(i_vec1);
cout << endl;
return EXIT_SUCCESS;
}
Production :
i_vec1 : 12; 32; 43; 53; 23; 65; 84;
i_vec1 (shuffled): 23; 53; 32; 84; 12; 65; 43;
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