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

时间:2013-07-25 21:37:02

标签: c++ arrays lua 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

问题是该表只能包含每个索引一次。 Thatswhy我需要像“桌子上的桌子”这样的东西,这可能吗?

有没有办法实现这个目标?我很高兴任何提示。

1 个答案:

答案 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的非唯一键/值对,但我真的怀疑你真的需要它。