我可以通过 C++ 将 lua_table 放入另一个表中来构建多维数组吗?

为了我的游戏,我尝试通过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

问题是表格当然只能包含每个索引一次。 因此我需要像“一个表格中的表格”这样的东西,这可能吗?

有办法实现这一点吗? 我非常感谢任何提示。

点赞
用户1183857
用户1183857

所以,从我的理解来看,如果你有两把“剑”,那么你不能存储第二把?如果是这样,你做错了。映射的键应该是唯一的,如果你决定使用 std::map 来存储你的物品,那么你的外部资源应该提供唯一的键。我在以前的游戏中使用了 std::string 作为键。例如:

"WeakSword" -> { 一些更多的数据 }
"VeryWeakSword" -> { 一些更多的数据 }

或者,根据你的数据(假设 item_ids 是唯一的),你可以从外部来源得到以下类似的东西:

1294 -> { 一些更多的数据 }
1678 -> { 一些更多的数据 }

我不确定这有多高效,但我没有编写一个需要高性能的 3D 先进游戏,所以它干得很好。

你使用的数据结构也取决于你将如何使用它。例如,如果你总是遍历这个结构,为什么不按如下方式存储:

class Item {public: ... private: std::string name; int id; int value;}
std::vector<Item> items // 注意,std::vector 在压入之前会复制项目

从外部源中提取(或解析)你想要的实际值,并将它们存储在 std::vector 中。到达 std::vector 中间的位置是昂贵的,但是,如果你的意图不是立即访问而是遍历数据,为什么要使用映射?但是,如果你的意图实际上是访问特定的键/值对,你应该改变你的外部数据并使用唯一键。

最后,还有另一个关联容器,可以存储非唯一键/值对,称为 std::multimap,但我真的怀疑你在这里 真的 需要它。

2013-07-26 07:41:43