Namensräume
Varianten
Aktionen

std::sample

Von cppreference.com
< cpp‎ | algorithm
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
sample
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
Definiert in Header <algorithm>
template< class PopulationIt, class SampleIt, class Distance, class URBG >

SampleIterator sample( PopulationIt first, PopulationIt last,

                       SampleIt out, Distance n, URBG&& g );
(seit C++17)

Wählt n Elemente aus der Sequenz [firstlast) (ohne Zurücklegen) aus, so dass jede mögliche Stichprobe die gleiche Wahrscheinlichkeit hat, ausgewählt zu werden, und schreibt diese ausgewählten Elemente in den Ausgabiterator out. Zufallszahlen werden mit dem Zufallszahlengenerator g generiert.

Wenn n größer ist als die Anzahl der Elemente in der Sequenz, werden alle Elemente in der Sequenz ausgewählt.

Der Algorithmus ist stabil (erhält die relative Reihenfolge der ausgewählten Elemente), nur wenn PopulationIt die Anforderungen an einen LegacyForwardIterator erfüllt.

Wenn der Werttyp von *first nicht in out geschrieben werden kann, ist das Programm ill-formed.

Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert

  • out befindet sich im Bereich [firstlast).
  • PopulationIt erfüllt nicht die Anforderungen eines LegacyInputIterator.
  • SampleIt erfüllt nicht die Anforderungen eines LegacyOutputIterator.
  • Alle folgenden Bedingungen sind erfüllt
(bis C++23)
(seit C++23)
  • Der Rückgabetyp von T ist nicht in Distance konvertierbar.
(bis C++20)

Inhalt

[bearbeiten] Parameter

first, last - das Paar von Iteratoren, das den Bereich der Elemente definiert, aus denen die Stichprobe entnommen werden soll (die Population)
out - der Ausgabiterator, an den die Stichproben geschrieben werden
n - Anzahl der zu entnehmenden Stichproben
g - der Zufallszahlengenerator, der als Quelle der Zufälligkeit verwendet wird
Typanforderungen
-
Distance muss ein ganzzahliger Typ sein.

[bearbeiten] Rückgabewert

Gibt eine Kopie von out nach der letzten ausgegebenen Stichprobe zurück, d. h. das Ende des Stichprobenbereichs.

[bearbeiten] Komplexität

Linear in std::distance(first, last).

[bearbeiten] Mögliche Implementierung

Siehe die Implementierungen in libstdc++, libc++ und MSVC STL.

[bearbeiten] Hinweise

Diese Funktion kann Auswahl-Sampling oder Reservoir-Sampling implementieren.

Feature-Test-Makro Wert Std Feature
__cpp_lib_sample 201603L (C++17) std::sample

[bearbeiten] Beispiel

#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>
#include <string>
 
int main()
{
    std::string in {"ABCDEFGHIJK"}, out;
    std::sample(in.begin(), in.end(), std::back_inserter(out), 4,
                std::mt19937 {std::random_device{}()});
    std::cout << "Four random letters out of " << in << " : " << out << '\n';
}

Mögliche Ausgabe

Four random letters out of ABCDEFGHIJK: EFGK

[bearbeiten] Siehe auch

(bis C++17)(C++11)
Ordnet Elemente in einem Bereich zufällig neu an
(Funktionstemplate) [edit]
Wählt N zufällige Elemente aus einer Sequenz aus
(Algorithmus-Funktionsobjekt)[edit]