从实现求差集介绍lua table需要注意的一些问题

用lua实现的求两个table的差集(只支持一维table)

从实现求差集介绍lua table需要注意的一些问题

1、lua table 判空:

table 判空,用的了next()函数。

next()函数说明:运行程序来遍历表中的所有域。 第一个参数是要遍历的表,第二个参数是表中的某个键。 next 返回该键的下一个键及其关联的值。 如果用 nil 作为

第二个参数调用 next 将返回初始键及其关联值。 当以最后一个键去调用,或是以 nil 调用一张空表时, next 返回 nil。 如果不提供第二个参数,将认为它就是 nil

可以用 next(t) 来判断一张表是否是空的。

2、tabale.remove():

table.remove(list[, post]) 移除 list 中 pos 位置上的元素,并返回这个被移除的值。 当 pos 是在 1 到 #list 之间的整数时, 它向前移动元素。不带pos,默认移除最后一个元素。

与tbl[key] = nil相比,赋值nil,table长度不会变短实际验证会删除,但是建议使用remove删除

正因为删除后,剩余的元素向前移动,所以不能在循环中这样使用(下面代码是错误的

从实现求差集介绍lua table需要注意的一些问题

因为在table表中使用for迭代时,将符合条件的元素删除时,后面元素前移,然后产生跳跃,而使用for i=1,#mytable 这样的循环时,由于在for时就已经确定了循环的终点是table的总长度,

在整个for运行过程中,终点不会改变。所以当你删除元素时,在循环到i = #mytable 时,会报错nil。因为此时table长度已经缩短了,所以特别注意不能在循环中删除table

3、table 的排列顺序:

lua table并非像数组一样顺序存储的,更加像是C++中的map,通过Key对应存储Value,但是并非顺序来保存key-value对,而是使用了hash的方式,这样能够更加快速的访问key对应的value。

所以遍历时并非是table的排列顺序,而是根据key的hash之排列的顺序遍历的

4、table 赋值:

lua当变量作为函数的参数进行传递时,类似的也是boolean,string,number类型的变量进行值传递。而table,function,userdata类型的变量进行引用传递,table的赋值实质也是引用。

例如:local table_a = table_b,在修改table_a时,table_b也修改了。

所以要赋值table需要这样操作:

从实现求差集介绍lua table需要注意的一些问题