Как я могу хранить заклинание и amp; элементов, использующих реализацию std :: vector?

Сейчас я следую за книгой из GameInstitute, и она просит меня:

  

Разрешить игроку покупать и носить лечебные зелья и зелья   огненный шар. Вы можете добавить массив Item (после определения класса элемента)   к классу Player для их хранения или использовать std :: vector для хранения   их.

Я думаю, что я хотел бы использовать реализацию std::vector, потому что это, похоже, путает меня меньше, чем создание класса предметов, но я я не знаю, как это сделать. Я слышал от многих людей, что векторы - отличные способы хранения динамических значений (например, предметов, оружия и т. Д.), Но я не видел, чтобы он использовался.

10 голосов | спросил Vladimir Marenus 5 12012vEurope/Moscow11bEurope/MoscowMon, 05 Nov 2012 20:14:29 +0400 2012, 20:14:29

1 ответ


13

std::vector - прекрасный способ хранения «динамических» (как вы их называете) вещей, таких как предметы, но реальная выгода от вектор не то, что вещь, которую вы храните, может измениться, но что количество элементов в векторе может измениться без минимальных усилий с вашей стороны. Чтобы продемонстрировать, нужно ли хранить объекты Item в качестве массива, вам нужно будет исправить размер массива при компиляции, (Item items[SIZE];), что означает, что у вас есть фиксированный верхний предел для пунктов (среди других вопросов, которые не имеют отношения к этому конкретному и поэтому я пропущу их).

Вы также можете динамически выделить массив во время выполнения (Item * items = new Item[SIZE];), который позволит вам изменить размер массива позже, выделив новое хранилище, копирование элементов и удаление старого хранилища. Это, однако, для вас намного больше работы.

К счастью, это то, что делает std::vector для вас - это реализация массива с динамическим размером, по существу, и обрабатывает управление памятью для увеличения массива, превышающего его текущую емкость для вас. Это определенно вариант, который я предлагаю вам продолжить, но обратите внимание, что вы все равно захотите создать класс Item.

Он очень прост в использовании:

// Create an item list and two item objects to add to it.
std::vector<Item> items;
Item fireballPotion("Potion of Fireball");
Item healingPotion("Potion of Healing");

// Add the items:
items.push_back(fireballPotion);
items.push_back(healingPotion);

// operator[] is supported for accessing items.
// This will print "Potion of Fireball" for example:
std::cout << items[0].GetName();

Документация MSDN для vector класс , вероятно, стоит прочитать, и если вы не знакомы с шаблонами - это то, что использует vector, чтобы позволить ему хранить «что угодно» - вам следует освежить основы там, как Что ж. Это также приводит меня к конечной точке: в то время как похоже, что вектор может хранить что-либо, у него есть ограничения для того, что ему разрешено, и иногда они бросают новичков. В частности, тип, который вы храните в векторе, должен быть скопирован, потому что вектор, например, должен будет копировать объекты при изменении размера его внутреннего хранилища. C + + правило из трех - вот что нужно запомнить здесь.

ответил Josh 5 12012vEurope/Moscow11bEurope/MoscowMon, 05 Nov 2012 20:42:10 +0400 2012, 20:42:10

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132