2017-01-21 13 views
0

Я занимаюсь программированием карточной игры. Для этой карточной игры я хочу перетасовать колоду. Колода вектор уникальных указателей и выглядит примерно так:Как я могу перетасовать вектор с уникальными указателями в случайной последовательности с помощью std :: shuffle?

std::vector<std::unique_ptr<Cards>> _deck; 

Я пытался получить случайную последовательность с функцией воспроизведения в случайном порядке из но я получаю следующее сообщение об ошибке: «Нет экземпляр шаблона функции» СТД :: перетасовать «совпадает с вектором аргументов». ". Посмотреть блок кода ниже аргументов.

std::shuffle(_buildings_deck.begin(), _buildings_deck.back(), std::default_random_engine{}); 

насколько я могу видеть аргументы, которые я использую правильно, мне еще нужно, чтобы выбрать случайный двигатель, но это не должно быть проблемой. Поэтому мне стало интересно, можно ли в случайном порядке использовать вектор уникальных указателей, и если да, то как?

+0

Перетасовать вектор (или список) reference_wrapper (http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper). –

+0

Есть ли причина, по которой «Карточка» - это нечто иное, чем целое? Почему вы используете здесь кучу? –

+0

@JesperJuhl Я попробовал эту кусок кода: «std :: vector > ref (_buildings_deck.begin(), _buildings_deck.end()) \t std :: shuffle (ref.begin(), ref.end(), std :: mt19937 {std :: random_device {}()}); ". Но теперь я получил ошибку, которую я пытаюсь ссылаться на удаленную функцию. Я знаю, что это распространенная ошибка при попытке скопировать переменную, пока нет хорошего конструктора копирования. И поскольку я использую уникальный указатель, невозможно скопировать переменную. Так может это проблема? Или я написал плохую часть кода? – user3473161

ответ

5

std :: shuffle() ожидает итератор случайного доступа, поскольку std :: vector has. Вы должны заменить std :: list на std :: vector.

+1

Любой итератор с произвольным доступом будет делать. Вы можете использовать std :: array, std :: deque и std :: vector. –

+0

Он может просто создать вектор reference_wrapper, а затем перетасовать его, чтобы получить перетасованное представление списка. –

 Смежные вопросы

  • Нет связанных вопросов^_^