函数列表:
table.insert(table,[ pos,] value)
table.remove(table[, pos])
table.concat(table[, sep[, i[, j]]])
table.sort(table[, comp])
1. insert 和 remove 只能用于数组元素的插入和移出, 进行插入和移出时,会将后面的元素对齐起来。
所以在 for 循环中进行 insert 和 remove 的时候要注意插入和移除时是否漏掉了某些项:
复制代码 代码如下:
local t = {1,2,3,3,5,3,6}
for i,v in ipairs(t) do
if v == 3 then
table.remove(t,i)
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] == 3 then
table.remove(t,i)
i = i-1
end
end
-- 错误,i=i-1 这段代码没有用,i 的值始终是从 1 到 #t,for 循环里修改 i 的值不起作用
local t = {1,2,3,3,5,3,6}
for i=#t, 1, -1 do
if t[i] == 3 then
table.remove(t,i)
end
end
-- 正确,从后往前遍历
local t = {1,2,3,3,5,3,6}
local i = 1
while t[i] do
if t[i] == 3 then
table.remove(t,i)
else
i = i+1
end
end
-- 正确,自己控制 i 的值是否增加
2. concat 可以将 table 的数组部分拼接成一个字符串,中间用 seq 分隔。
lua 中字符串的存储方式与 C 不一样,lua 中的每个字符串都是单独的一个拷贝,拼接两个字符串会产生一个新的拷贝,如果拼接操作特别多,就会影响性能:
复制代码 代码如下:
local beginTime = os.clock()
local str = ""
for i=1, 30000 do
str = str .. i
end
local endTime = os.clock()
print(endTime - beginTime)
-- 消耗 0.613 秒,产生了 30000 个字符串拷贝,但只有最后一个是有用的
local beginTime = os.clock()
local t = {}
for i=1, 30000 do
t[i] = i
end
local str = table.concat(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 :
复制代码 代码如下:
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);
}
看以上代码,如果 a==b 时返回 true 且边界上的几个值是相等的话, sort_comp 就无法阻止 i 继续增长,直到超出边界引发异常 attempt to compare number with nil;即使我们对 a 和 b 进行非空判断,也会因为 i 超过边界而引发异常 invalid order function for sorting
快速排序是什么,lua 如何实现快速排序,可以参考 lua 源码中的描述,这里不多介绍;
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 刘德华.1989-永远...记得你(2012金碟复刻版)【EMI百代】【WAV+CUE】
- 《维纳斯璀璨假期死或生Xtreme》游戏特色玩法
- 《完蛋我被美女包围了前传》角色介绍
- 2024年免费游戏加速器推荐,稳定才是王道!
- 《蛋仔派对》小海鹦兰兰皮肤图鉴
- 《蛋仔派对》憨憨小六皮肤图鉴
- 《蛋仔派对》打工小电视皮肤图鉴
- 叶启田2006-人生[台湾首版][WAV+CUE]
- [雨果唱片]陈百强2012《同名专辑LPCD45》[WAV+CUE]
- 安七炫2005-面具(中文版)[SM娱乐][WAV+CUE]
- 曝AMD曾有机会为Switch2提供芯片 却因能耗错失机会
- 《塞尔达传说:智慧的再现》新作上市宣传片公开 M站86分
- 宫本茂谈AI技术应用:任天堂更愿意走不同的路
- 《蔡琴 不了情 经典歌曲香港演唱会2CD》[ISO][6.6GB]
- 《萧煌奇 说故事的歌 2022》[FLAC/分轨][380MB]