0

对于我的游戏,我试图通过 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

问题是表当然只能包含每个索引一次。那为什么我需要“一张桌子”之类的东西,这可能吗?

有没有办法做到这一点?我很高兴有任何提示。

4

1 回答 1

0

所以据我了解,如果您有两把“剑”,那么您就不能存储第二把吗?如果是这样的话,你就做错了。map 的键应该是唯一的,如果您决定要使用它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是昂贵的,但是,如果您的意图不是即时访问而是迭代数据,为什么要使用 map?但是,如果您的意图实际上是达到特定的键/值对,您应该更改您的外部数据并使用唯一键。

最后,还有另一个关联容器,用于存储非唯一键/值对,std::multimap但我真的怀疑您是否真的需要它。

于 2013-07-26T07:41:43.813 回答