Ошибка при работе алгоритма shuffle

152
22 мая 2019, 11:30
const int Size=100;
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 1000);
int main()
{
list<double>a(Size);
   iota(a.begin(), a.end(), 2);
   shuffle(a.begin(),a.end(),dis(gen));
}

Ошибка:error: no match for 'operator+' (operand types are 'std::_List_iterator<double>' and 'int')

Answer 1

Идем в документацию std::shuffle:

...

template< class RandomIt, class URNG >
void shuffle( RandomIt first, RandomIt last, URNG&& g );

...

Требования к типам

-RandomIt должен соответствовать требованиям ValueSwappable и RandomAccessIterator.

-URNG должен соответствовать требованиям UniformRandomNumberGenerator.

Т.е. передаваемые итераторы должны иметь перегруженный operator+, которого нет у итератора std::list, который сам по себе является контейнером с последовательным доступом.

Answer 2

list не предоставляет итератор с произвольным доступом, shuffle к нему неприменим (оператор +, о котором идет речь в сообщении об ошибке, не определен для итератора контейнера list).

Воспользуйтесь vector<double>.

READ ALSO
Одномерный массив

Одномерный массив

Описать функцию, которая в новом массиве получит только положительные значения элементов исходного массиваИспользовать механизм указателей

137
Как добавить элементы в массив static const char *

Как добавить элементы в массив static const char *

В общем, есть массив и нужно в него подобавлять элементовВопрос:каким образом это осуществить?

174
Посчитать количество строк в функции

Посчитать количество строк в функции

Можно ли как-то узнать, сколько строчек в функции? Возможно, рекурсивно посчитать все строчки для всех вызываемых подфункцийНадо подобное...

147