Я чувствую, что это очень простой, почти глупый вопрос. Я просто забыл, что я должен знать, как это сделать.Какой тип контейнера следует использовать для хранения целого числа ObjectID?
У меня есть GameObjects, которые хранятся в универсальном GameObjectManager. Эти GameObjects имеют ObjectID, который является простым int.
Мне нужно уметь вставлять или удалять эти GameObjects в мире с 2D-плиткой, где каждая ПЛИТКА содержит контейнер ObjectID.
Таким образом, я могу захватить конкретную плитку (например, плитка [10] [10]), а затем посмотреть, какие объекты GameObject находятся на Tile [10] [10], прочитав из контейнера. (например, «Ах, поэтому персонаж № 4302 и № 123 находятся на плитке [10] [10]!»)
Прямо сейчас, каждая «Плитка» представляет собой структуру в массиве MAP из Плитки.
struct MapTile
{
std::vector <int> GameObject_MapList ; //list of Objects on this map location
TileTerrainType tileTerrainType; //GFX to display Grass, Sand, Water, Swamp, etc.
};
MapTile mlMap[100][100]; //map array
Однако, я читал, что векторы не должны использоваться при произвольном добавлении/удалении переменных. Это не похоже на то, что я удалю первую или последнюю переменную в массиве. Вместо этого мне придется вызвать определенный ObjectID и удалить его из любого места в массиве.
По этой причине я думал об использовании другого контейнера. Возможно, я просто слишком устал, но я мог бы использовать некоторые советы о том, какой контейнер использовать, и как перейти к удалению SPECIFIC переменных в контейнере.
Например, GameObject имеет ObjectID "422". Плитка [2] [8] содержит контейнер, который имеет следующие целые числа по порядку: 420, 421, 422, 433, 486, 800.
У меня есть функция: RemoveGameObjectFromMap (int ObjectID); Поэтому мне нужно, чтобы удалить 422, всякий раз, когда я печатаю (RemoveGameObjectFromMap (422).
Я имел обыкновение использовать контейнер карты, но это не является необходимым Vector, согласно cplusplus.com было бы плохо для этого
.
Возможно, я смущен, потому что я неправильно обрабатываю свои классы. Чем больше я думаю об этом, тем больше я понимаю, что я должен, вероятно, позволить классу MAP получить полный доступ к GameObjectManager класса WORLD. Я делаю это только потому, что мой прежний способ справиться с этим (MAP, который содержал фактические игровые объекты), состоит в том, что TILES больше не удерживают фактические GameObjects, а вместо этого просто удерживают их int ObjectID. – Carter81
Является ли вектор хорошим или плохим, зависит от ряда факторов. Как и количество идентификаторов на каждый фрагмент (в среднем), насколько часто вставляются, удаляются и ищутся, сколько нужно для минимизации использования памяти и 100 других соображений. Короче говоря, простых ответов нет.Очевидная альтернатива std :: vector в этом случае будет std :: unordered_set (я предполагаю, что вы никогда не хотите, чтобы один и тот же идентификатор в одной и той же плитке более одного раза). – john
Вставки и удаления являются постоянными. В любое время, когда игрок немного перемещается, они будут удалены и вставлены в новый MapTile. – Carter81