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]
?
关于std::sample
的参考说明:
仅当PopulationIterator满足LegacyForwardIterator的要求时,算法才是稳定的(保留所选元素的相对顺序)
PopulationIterator这里是std::vector
的迭代器。 std::vector
的迭代器是LegacyRandomAccessIterator,它满足LegacyBidirectionalIterator的类型,而LegacyForwardIterator又满足[1, 2, 3]
的类型。
所以,是的,保证输出永远不可能是[2, 1, 3]
,因为这会违反所选元素的相对顺序,即std::sample。
来自https://en.cppreference.com/w/cpp/algorithm/sample:
仅当PopulationIterator满足LegacyForwardIterator的要求时,算法才是稳定的(保留所选元素的相对顺序)
据PopulationIterator
说:
只有当LegacyForwardIterator满足
PopulationIterator
的要求时,算法才是稳定的(保留所选元素的相对顺序)
在你的情况下,std::vector<int>::iterator
是LegacyRandomAccessIterator,它确实是LegacyForwardIterator(实际上是output
),所以,是的,元素应该在input
中具有与qazxswpoi中相同的元素。