【问题标题】:Can I put a lua_table in another table to build a multi-dimensional array via C++?我可以将 lua_table 放在另一个表中以通过 C++ 构建多维数组吗?
【发布时间】:2013-07-26 00:07:47
【问题描述】:

对于我的游戏,我试图通过 C++ 完成以下数组结构,因为数据来自外部源并且应该在 lua_script 中可用。

数组结构应该是这样的:(数据在一个映射中,映射包含变量的名称和一个 Pairs 列表(每一对是一个键值对,被认为是一个子数组中的一个元素)。 ..

地图中准备的数据是完整的,结构绝对没问题。 所以基本上我有

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

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

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

【问题讨论】:

    标签: c++ arrays lua lua-table


    【解决方案1】:

    所以据我了解,如果您有两把“剑”,那么您就不能存储第二把吗?如果是这样的话,你就做错了。 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,但我真的怀疑您真的需要它。

    【讨论】:

    • 嗯,我想你理解错了,或者我解释错了。项目名称和 ID 是唯一的,但我需要为每个表字段分配一个数组而不是单个值,因为每个项目都可以有可选的数据量。
    • std::map<:string std::vector>> 其中 Properties 是您可以创建以存储一些数据的结构,而 key 是名称(或者您可以使其成为 id,在这种情况下,键将是 int)。根据您的示例,您可以创建一个属性结构/类,其中包含可变数量的字段,例如 int id、std::vector 价格/成本等。
    猜你喜欢
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多