Как я могу эффективно выбрать случайный элемент из std::set
?
A std::set::iterator
не является итератором произвольного доступа. Поэтому я не могу напрямую индексировать случайно выбранный элемент, как я мог, для std::deque
или std::vector
Я мог бы взять итератор, возвращенный из std::set::begin()
, и увеличить его 0
до std::set::size()-1
раз, но это, похоже, делает много ненужной работы. Для "индекса", близкого к заданному размеру, я бы прошел через всю первую половину дерева, хотя он уже знал, что элемент там не будет найден.
Есть ли лучший подход?
Во имя эффективности я готов определить "случайный" как менее случайный, чем любой подход, который я мог использовать для выбора случайного индекса в векторе. Назовите его "разумно случайным".
Изменить...
Много проницательных ответов ниже.
Краткая версия состоит в том, что, хотя вы можете найти определенный элемент в log (n) времени, вы не можете найти произвольный элемент за это время через интерфейс std::set
.