(转)Lua的table库函数insert、remove、concat、sort详细介
原帖链接:
有增注标识的地⽅为额外注释,⾮原帖内容。
函数列表:(增注:只能⽤于数组!)
table.insert(table,[ pos,] value)
table.sort(table[, comp])
1. insert 和 remove 只能⽤于数组元素的插⼊和移出,进⾏插⼊和移出时,会将后⾯的元素对齐起来。
(增注:和C++⾥对std::vector等容器使⽤iterator迭代器进⾏删除类似)
所以在 for 循环中进⾏ insert 和 remove 的时候要注意插⼊和移除时是否漏掉了某些项:
local t = {1,2,3,3,5,3,6}
for i,v in ipairs(t) do
if v == 3then
end
end
-- 错误,第四个 3 没有被移除,ipairs 内部会维护⼀个变量记录遍历的位置,remove 掉第三个数字 3 之后,ipairs 下⼀个返回的值是 5 ⽽不是 3
local t = {1,2,3,3,5,3,6}
for i=1, #t do
if t[i] == 3then
i = i-1
end
end
-- 错误,i=i-1 这段代码没有⽤,i 的值始终是从 1 到 #t,for 循环⾥修改 i 的值不起作⽤
local t = {1,2,3,3,5,3,6}
if t[i] == 3then
end
end
-- 正确,从后往前遍历
local t = {1,2,3,3,5,3,6}
local i = 1
while t[i] do
if t[i] == 3then
else
i = i+1
end
end
-- 正确,⾃⼰控制 i 的值是否增加
2. concat 可以将 table 的数组部分拼接成⼀个字符串,中间⽤ seq 分隔。
(增注:对字符串的操作,⼀定要避免使⽤..符号!可以使⽤string.format进⾏操作,性能上⽐..要⾼得多)
lua 中字符串的存储⽅式与 C 不⼀样,lua 中的每个字符串都是单独的⼀个拷贝,拼接两个字符串会产⽣⼀个新的拷贝,如果拼接操作特别多,就会影响性能
local beginTime = os.clock()
local str = ""
for i=1, 30000do
str = str .. i
end
local endTime = os.clock()
print(endTime - beginTime)
-- 消耗 0.613 秒,产⽣了 30000 个字符串拷贝,但只有最后⼀个是有⽤的
local beginTime = os.clock()
local t = {}
t[i] = i
end
local str = at(t, "")
local endTime = os.clock()
print(endTime - beginTime)
-- 消耗 0.024 秒,利⽤ concat,⼀次性把字符串拼接出来,只产⽣了⼀个字符串拷贝
3. sort 可以将 table 数组部分的元素进⾏排序,需要提供 comp 函数,comp(a, b) 如果 a 应该排到 b 前⾯,则 comp 要返回 true 。注意,对于 a==b 的情况,⼀定要返回 false :
trunc函数mysql
local function comp(a,b)
return a <= b
end
table.sort(t,comp)
-- 错误,可能出现异常:attempt to compare number with nil
local function comp(a,b)
if a == nil or b == nil then
return false
end
return a <= b
end
table.sort(t,comp)
-- 错误,可能出现异常:invalid order function for sorting
-
- 也可能不报这个异常,但结果是错误的;
之所以 a==b 返回true 会引发这些问题,是因为table.sort在实现快速排序时没有做边界检测:
for (;;) {
while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) {  // 未检测边界, i 会⼀直增加
if (i>=u) luaL_error(L, "invalid order function for sorting");
lua_pop(L, 1);
}
while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) {  // 未检测边界, j 会⼀直减少if (j<=l) luaL_error(L, "invalid order function for sorting");
lua_pop(L, 1);
}
if (j<i) {
lua_pop(L, 3);
break;
}
set2(L, i, j);
}
增注:下⾯为正确的写法(这⾥省略了b == nil)
local function comp(a,b)
if a == nil or a == b then
return false
end
return a < b
end
table.sort(t,comp)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。