Могу ли я поместить lua_table в другую таблицу для построения многомерного массива через C ++?

для моей игры я пытаюсь создать следующую структуру массива на 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

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

Есть ли способ добиться этого? Я рад за любые подсказки.

0

Решение

Итак, из того, что я понимаю, если у вас есть два «меча», то вы не можете хранить второй? Если это так, вы делаете это неправильно. Ключ карты должен быть уникальным, и если вы решите, что собираетесь использовать 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 но я действительно сомневаюсь в тебе действительно нужно здесь.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]