对于我的游戏我试图通过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
问题是该表只能包含每个索引一次。 Thatswhy我需要像“桌子上的桌子”这样的东西,这可能吗?
有没有办法实现这个目标?我很高兴任何提示。
答案 0 :(得分:0)
所以从我的理解,如果你有两把“剑”,那么你不能存储第二个?如果是这样的话,你做错了。地图的关键应该是唯一的,如果您决定使用std::map
来存储商品,那么您的外部来源应该提供唯一的密钥。我在之前的游戏中使用std::string
作为关键。例如:
"WeakSword" -> { some more data }
"VeryWeakSword" -> { some more data }
或者,对于您的数据(假设item_ids是唯一的),您可以从外部来源获得以下内容:
1294 -> { some more data }
1678 -> { some more data }
我不确定这是多么有效但是我没有编写一个硬件需要的3D前沿游戏,所以它只是做得很好。
您使用的数据结构也取决于您将如何使用它。例如,如果您总是迭代这个结构,为什么不按如下方式存储:
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
的非唯一键/值对,但我真的怀疑你真的需要它。