для моей игры я пытаюсь создать следующую структуру массива на C ++, потому что данные поступают из внешнего источника и должны быть доступны в lua_script.
Структура массива должна выглядеть следующим образом: (данные находятся на карте, карта содержит имя переменной и список пар (каждая пара представляет собой пару ключ-значение, которая считается одним элементом в одном подмассиве) …
Данные, подготовленные на карте, полны, и структура определенно в порядке.
Так что в основном у меня есть
typedef std::map<std::string, std::list<std::pair> >;
/\index(e.g: sword) /\ /\
|| ||
|| Pair: Contains two strings (key/value pair)
||
List of Pairs for each array
items = {
["sword"] = {item_id = 1294, price = 500},
["axe"] = {item_id = 1678, price = 200},
["red gem"] = {item_id = 1679, price = 2000},
}
То, что я получил до сих пор, это:
for(ArrayMap::iterator it = this->npc->arrayMap.begin(); it != this->npc->arrayMap.end(); it++) {
std::string arrayName = (*it).first;
if((*it).second.size() > 0) {
lua_newtable(luaState);
for(ArrayEntryList::iterator itt = (*it).second.begin(); itt != (*it).second.end(); itt++) {
LuaScript::setField(luaState, (*itt).first.c_str(), (*itt).second.c_str());
}
lua_setglobal(luaState, arrayName.c_str());
}
}
Но это только создаст следующую структуру:
(table)
[item_id] = (string) 2000
[name] = (string) sword
[price] = (string) 500
Проблема в том, что таблица может содержать каждый индекс только один раз.
Вот почему мне нужно что-то вроде «стол в столе», это возможно?
Есть ли способ добиться этого? Я рад за любые подсказки.
Итак, из того, что я понимаю, если у вас есть два «меча», то вы не можете хранить второй? Если это так, вы делаете это неправильно. Ключ карты должен быть уникальным, и если вы решите, что собираетесь использовать std::map
чтобы хранить ваши предметы, тогда ваш внешний источник должен предоставить уникальные ключи. я использовал std::string
как ключ к моей предыдущей игре. Пример:
"WeakSword" -> { some more data }
"VeryWeakSword" -> { some more data }
или с вашими данными (предполагая, что item_ids уникальны) вы можете получить что-то вроде следующего из внешнего источника:
1294 -> { some more data }
1678 -> { some more data }
Я не уверен, насколько это эффективно, но я не программировал аппаратно-жаждущую трехмерную игру, поэтому она просто отлично поработала.
Используемая вами структура данных также зависит от того, как вы собираетесь ее использовать. Например, если вы всегда перебираете эту структуру, почему бы не хранить следующее:
class Item {public: ... private: std::string name; int id; int value;}
std::vector<Item> items // be careful tho, std::vector copies item before it pushes
Извлеките (или проанализируйте?) Фактическое значение, которое вы хотите получить от каждого объекта во внешнем источнике, и сохраните их в std::vector
, Достигнув середины std::vector
дорого, однако, если ваше намерение состоит не в мгновенном доступе, а в итерации по данным, зачем использовать карту? Но если ваше намерение на самом деле заключается в достижении определенной пары ключ / значение, вам следует изменить свои внешние данные и использовать уникальные ключи.
Наконец, есть еще один ассоциативный контейнер, в котором хранятся неуникальные пары ключ / значение. std::multimap
но я действительно сомневаюсь в тебе действительно нужно здесь.
Других решений пока нет …