Vektor mischen in C++
-
Verwenden des
shuffle
-Algorithmus zum Mischen von Vektorelementen -
Verwenden des
random_shuffle
-Algorithmus zum Mischen von Vektorelementen
Dieser Artikel demonstriert mehrere Methoden, wie man Vektorelemente in C++ mischen kann.
Verwenden des shuffle
-Algorithmus zum Mischen von Vektorelementen
std::shuffle
ist Teil der C++-Bibliothek <algorithm>
und implementiert die Funktion der zufälligen Permutation, die auf die Elemente des angegebenen Bereichs angewendet werden kann. Die Funktion nimmt Bereichs-Iteratoren als die ersten beiden Argumente und den Zufallszahlengenerator als drittes. Ein Zufallszahlengenerator ist ein Funktionsobjekt. Contemporary C++ empfiehlt die Verwendung der Standardbibliotheksdienstprogramme der Zufallszahlengenerierung. Für nicht-deterministische Zahlengenerierung sollte std::random_device
verwendet werden.
Schließlich muss das gewählte Objekt der Zufallszahlenmaschine erstellt und an den Algorithmus shuffle
übergeben werden, um eine zufällige Permutation des Bereichs zu erzeugen. Beachten Sie, dass wir einen Vektor von Ganzzahlen vor und nach dem Mischen ausgeben.
#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;
}
Ausgabe:
i_vec1 : 12; 32; 43; 53; 23; 65; 84;
i_vec1 (shuffled): 53; 32; 84; 23; 12; 43; 65;
Als Alternative zur vorherigen Methode kann man das gleiche Unterprogramm mit den Objekten std::begin
und std::end
implementieren, um die Bereichsiteratoren an die Funktion shuffle
zu übergeben. Das folgende Beispiel könnte eine allgemeinere Version für spezielle Kodierungsszenarien sein.
#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;
}
Ausgabe:
i_vec1 : 12; 32; 43; 53; 23; 65; 84;
i_vec1 (shuffled): 43; 23; 32; 65; 53; 12; 84;
Verwenden des random_shuffle
-Algorithmus zum Mischen von Vektorelementen
std::random_shuffle
ist ein weiterer Utility-Algorithmus aus der C++ Standardbibliothek. Die ältere Version von std::shuffle
wurde für die neuesten C++-Standards abgewertet. Er kann jedoch in älteren C++-Umgebungen, in denen ältere Versionen verfügbar sind, weiter verwendet werden.
random_shuffle
kann einen vom Benutzer bereitgestellten Zufallszahlengenerator annehmen, aber da den älteren Versionen von C++ die Möglichkeiten der Zufallsbibliothek fehlten, kann man der Funktion nur Bereichsiteratoren zur Verfügung stellen. Im letzteren Fall verwendet random_shuffle
einen implementierungsdefinierten Zufallszahlengenerator, der manchmal der Funktionsaufruf std::rand
ist.
#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;
}
Ausgabe:
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