Лучшая версия того же , потому что она работает с любым контейнером, а не только с векторами.Вот версия C ++ 03:
template <typename ForwardIterator>
ForwardIterator random_element(ForwardIterator begin, ForwardIterator end)
{
typename std::iterator_traits<ForwardIterator>::difference_type
size = std::distance(begin, end);
if (size) //divide by zero errors are bad
std::advance(begin, std::rand() % size);
return begin;
}
Если вы работаете на C ++ 11, вы можете заменить вышеприведенное на следующее:
template <typename ForwardIterator>
ForwardIterator random_element(ForwardIterator begin, ForwardIterator end)
{
auto size = std::distance(begin, end);
if (size) //divide by zero errors are bad
std::advance(begin, std::rand() % size);
return begin;
}
, что обходит std::iterator_traits<t>::difference_type
клей.