从实现求差集介绍lua table需要注意的一些问题
用lua实现的求两个table的差集(只支持一维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删除)
正因为删除后,剩余的元素向前移动,所以不能在循环中这样使用(下面代码是错误的):
因为在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需要这样操作: