FredBienvenu Ответов: 1

Какой контейнер (ы) std использовать для представления стопки игральных карт


Всем привет,

В настоящее время я работаю над проектом, который подразумевает стопки игральных карт.
И мне трудно решить, какой контейнер(ы) использовать для их представления.

Вот основные требования, которые я могу перечислить:

- стек должен быть последовательный потому что порядок карт очень важен. Ведет меня к контейнерам последовательности.

- этот размер из стека не фиксируется Карты можно вынимать из случайных мест, в любом количестве, и то же самое для добавления карт. Приводит меня к std:: list.

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

- Мы сможем это сделать. перетасуйте стопку.

- Это так не возможно, чтобы два раза добавить та же карта в стопке. Карты являются флагами с уникальными идентификаторами, так что технически я могу иметь двух пиковых королей в одной стопке, но не с одним и тем же идентификатором (если вы объедините две колоды карт для игры).

Я знаю, что однозначного ответа нет, но если у вас есть хоть какая-то подсказка, чтобы помочь мне решить окончательную структуру моей стопки игральных карт, это было бы здорово !

Что я уже пробовал:

Я уже представил несколько представлений.

Сначала я представляю стек с помощью вектор из карт.
Это решение работает для всех ограничений,но оно медленно проверяет, содержится ли карта или подмножество карт в стеке.
Также дорого добавить или удалить карту в случайном месте.

Затем я использовал сочетание в список карты и unordered_map.
И то, и другое синхронизируется операциями добавления и удаления.
То список используется для последовательности, гибкости размера и случайного добавления/удаления.
То unordered_map используется для произвольного доступа (метод содержит).

Затем я понял, что использовать std::shuffle в списке невозможно. Так что на данный момент я использую вектор и еще unordered_map Возвращаясь к проблеме случайного добавления/удаления...

1 Ответов

Рейтинг:
2

Rob Grainger

std:: vector действительно должен быть вашим дефолтом, особенно для небольшого количества предметов (я предполагаю, что у вас есть не более 54 карт (13x4 + 2 Джокера).

Списки имеют возможность вставлять легко, но за счет почти всего остального. Реально, если вы не выбираете действительно глупое представление каждой карты, вы должны иметь возможность иметь весь стек в кэше вашего процессора, так что даже смещение не более 53 карт на одно место для вставки не имеет большого значения.

Точно так же стоимость поиска списка из 54 пунктов вряд ли будет дорогой.

Как это было рекомендовано Страуструп: Являются ли списки злом?[^]


FredBienvenu

Спасибо тебе, Роб, за ответ.
На самом деле это правда, что количество карт в моих стопках останется довольно маленьким.

Кроме того, что вы думаете о том, чтобы синхронизировать unordered_map, чтобы проверить, содержит ли стек карту ?

Rob Grainger

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

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