使用C API订购lua表循环

时间:2014-12-16 17:11:33

标签: c++ c lua lua-table

考虑以下lua表:

foo = {
    bar1 = {a = 1, b = 2, c = "hello"},
    bar2 = {a = 5, b = 2, c = "bbq"},
    bar3 = {a = 76, b = 13, c = "pwnd"}
}

我正在尝试使用lua C API迭代此表来检索键名,bar1,bar2和bar3。我使用lua_next(L, -2)函数按照许多人的建议迭代,但问题是它以随机顺序返回元素。每次运行时订单都会发生变化。

我使用以下代码:

for( lua_pushnil(L); lua_next(L, -2) != 0; lua_pop(L, 1) )
{
    printf("%s\n", lua_tostring(L, -2));
}

大多数情况下,输出是无序的,例如bar2 bar1 bar3。幸运的是,它是订购的。是否有一种简单的方法以有序的方式循环表键?什么是我使用的等效代码,但订购?谢谢!

修改

我知道我使用的是地图而不是数组。但是在lua脚本中我们有ipairs,这对于这种情况会很好。我正在寻找C API等价物。我发现this stackoverflow answer给出了不同的答案,但它对我不起作用,所以我想知道这个答案是好的还是相关的。

3 个答案:

答案 0 :(得分:3)

没有。 Lua遍历表的顺序是未定义的。

如果您知道密钥的格式为barXXX,那么您可以按照您希望的顺序动态创建这些密钥,然后从表中获取相应的值。

答案 1 :(得分:2)

将名称放在C数组中,然后在C中对它们进行排序。

正如其他人所说的那样,表格的哈希部分返回的键的顺序无法保证。

或者,使用类似数组的结构,以便您可以使用数组部分:

foo = {
  {name = 'bar1', a = 1,  b = 2,  c = "hello"},
  {name = 'bar2', a = 5,  b = 2,  c = "bbq"},
  {name = 'bar3', a = 76, b = 13, c = "pwnd"}
}

因此,您可以使用ipairs或等效于for i=1,#foo来按顺序迭代项目。

答案 2 :(得分:1)

检查Lua的文档,the main structure that Lua supports is a Hash Table。鉴于它总是一个哈希表,你可能想重新实现foo as an arraybar1bar2等可以是进入数组的一部分,如下所示:

foo = {}
foo[0] = {name='bar1', ...}
foo[1] = {name='bar2', ...}
    ...

或@lhf建议,只需在for循环中构建bar名称(如果你知道它是按顺序)并从foo表中检索值。