Vektor mischen in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden des shuffle-Algorithmus zum Mischen von Vektorelementen
  2. Verwenden des random_shuffle-Algorithmus zum Mischen von Vektorelementen
Vektor mischen in C++

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;
Autor: 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

Verwandter Artikel - C++ Vector