[ Web Proxy ]
URL:
Viewing: https://cppreference.com/cpp/algorithm/sample [Back]  [Original]

std::sample - cppreference.com
cppreference.com
Namespaces
Variants

std::sample

From cppreference.com
 
 
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy, ranges::sort, ...
Non-modifying sequence operations    
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17)(C++11)
(C++20)(C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
(C++11)    

Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
(C++11)
(C++17)
Lexicographical comparison operations
Permutation operations


 
Defined in header <algorithm>
template< class PopulationIt, class SampleIt, class Distance, class URBG >
SampleIterator sample( PopulationIt first, PopulationIt last,
                       SampleIt d_first, Distance count, URBG&& gen );
(since C++17)

Randomly copies count different elements from the source range [firstlast) to the destination range beginning at d_first, such that each possible combination has equal probability of appearance. The source of randomness is gen.

If count is greater than std::distance(first, last), all elements in the source range will be copied.

The algorithm is stable (preserves the relative order of the selected elements) only if PopulationIt meets the requirements of LegacyForwardIterator.

If the value type of first(until C++20)*first(since C++20) is not writable to out, the program is ill-formed.

If any of the following conditions is satisfied, the behavior is undefined:

  • d_first is in the source range.
  • PopulationIt does not meet the requirements of LegacyInputIterator.
  • SampleIt does not meet the requirements of LegacyOutputIterator.
  • All following conditions are satisfied:
(until C++23)
(since C++23)
  • Given the type T as std::remove_reference_t<URBG>, any of the following conditions is satisfied:
  • The return type of T is not convertible to Distance.
(until C++20)

Parameters

first, last - the pair of iterators defining the source range
d_first - the beginning of the destination range
count - the sample size
gen - the random number generator
Type requirements
-
Distance must be an integer type.

Return value

The past-the-end iterator of the destination range.

Complexity

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

Notes

This function may implement selection sampling or reservoir sampling.

Feature-test macro Value Std Feature
__cpp_lib_sample 201603L (C++17) std::sample

Possible implementation

See the implementations in libstdc++, libc++ and MSVC STL.

Example

#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';
}

Possible output:

Four random letters out of ABCDEFGHIJK: EFGK

See also

selects N random elements from a sequence
(algorithm function object)[edit]
(until C++17)(C++11)
randomly re-orders elements in a range
(function template & algorithm function object)[edit]

Web Proxy Viewer  |  New URL  |  Original Page