Соответствует ли последовательность вывода `std :: sample ()` порядку последовательности ввода? - PullRequest
0 голосов
/ 20 февраля 2019

Соответствует ли последовательность вывода 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]

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

С std :: sample :

Алгоритм стабилен (сохраняет относительный порядок выбранных элементов) только в том случае, если PopulationIterator соответствует требованиям LegacyForwardIterator

0 голосов
/ 20 февраля 2019

Ссылка на std::sample гласит:

Алгоритм стабилен ( сохраняет относительный порядок выбранных элементов ), только если PopulationIterator соответствует требованиям LegacyForwardIterator

PopulationIterator здесь итератор std::vector.Итератор std::vector является LegacyRandomAccessIterator , который удовлетворяет типу LegacyBidirectionalIterator , который, в свою очередь, удовлетворяет типу LegacyForwardIterator .

Итак, да, гарантировано , что выходной результат никогда не будет равен [1, 2, 3], поскольку это нарушит относительный порядок выбранногоэлементы, которые будут [2, 1, 3].

0 голосов
/ 20 февраля 2019

Согласно https://en.cppreference.com/w/cpp/algorithm/sample:

Алгоритм стабилен (сохраняет относительный порядок выбранных элементов), только если PopulationIterator соответствует требованиям LegacyForwardIterator

В вашем случае PopulationIterator - это std::vector<int>::iterator, что действительно является LegacyForwardIterator (и фактически LegacyRandomAccessIterator ), поэтому, да, элементы должны иметь такой же элемент в output, как они были в input.

...