`std :: sample()`的输出序列是否遵循输入序列的顺序?

问题描述 投票:2回答:3

std::sample()的输出序列是否遵循输入序列的顺序?

例如,

const std::vector<int> input{2, 4, 6, 8, 1, 3, 5, 7};
std::vector<int> output;
std::sample(input.begin(), input.end(), std::back_inserter(output), 3, any_urbg);

是否保证output永远不可能成为[1, 2, 3]

c++ algorithm random c++17
3个回答
1
投票

关于std::sample的参考说明:

仅当PopulationIterator满足LegacyForwardIterator的要求时,算法才是稳定的(保留所选元素的相对顺序)

PopulationIterator这里是std::vector的迭代器。 std::vector的迭代器是LegacyRandomAccessIterator,它满足LegacyBidirectionalIterator的类型,而LegacyForwardIterator又满足[1, 2, 3]的类型。

所以,是的,保证输出永远不可能是[2, 1, 3],因为这会违反所选元素的相对顺序,即std::sample


1
投票

来自https://en.cppreference.com/w/cpp/algorithm/sample

仅当PopulationIterator满足LegacyForwardIterator的要求时,算法才是稳定的(保留所选元素的相对顺序)


0
投票

PopulationIterator说:

只有当LegacyForwardIterator满足PopulationIterator的要求时,算法才是稳定的(保留所选元素的相对顺序)

在你的情况下,std::vector<int>::iteratorLegacyRandomAccessIterator,它确实是LegacyForwardIterator(实际上是output),所以,是的,元素应该在input中具有与qazxswpoi中相同的元素。

© www.soinside.com 2019 - 2024. All rights reserved.