如何删除Lua表中的所有元素?我不想这样做:
t = {}
table.insert(t, 1)
t = {} -- this assigns a new pointer to t
我想保留与t相同的指针,但删除t
中的所有元素。
我试过了:
t = {}
table.insert(t, 1)
for i,v in ipairs(t) do table.remove(t, i) end
以上是否有效?还是需要其他东西?
答案 0 :(得分:35)
for k in pairs (t) do
t [k] = nil
end
也可以工作 - 如果表格不是作为一个数组使用,你可能会遇到ipairs的困难。
答案 1 :(得分:15)
表格元素的插入和删除 绩效比较
表格大小计数10000000
[1] while和rawset
while #t ~= 0 do rawset(t, #t, nil) end
花费的时间= 0.677220
[2] next和rawset
for k in next, t do rawset(t, k, nil) end
花费的时间= 0.344533
[3] ipairs和rawset
for i, v in ipairs(t) do t[i] = nil end
花费的时间= 0.012450
[4] for,rawset
count = #t
for i=0, count do t[i]=nil end
花费的时间= 0.009308
表elemnets insert
[1]表插入功能
for i=0, 10000000 do table.insert(t, i, i) end
花费的时间= 1.0590489
[2]使用#t
for i=0, 10000000 do t[#t+1] = i end
花费的时间= 0.703731
[3] for,rawset
for i=0, 10000000 do rawset(t, i, i) end
花费的时间= 0.100010
结果。
最快删除:4
最快插入:3
答案 2 :(得分:13)
最简单,最高效:
for k,v in pairs(tab) do tab[k]=nil end
你的建议是不可用的:table.remove
移动剩余的元素以关闭洞,从而弄乱了桌面遍历。有关详细信息,请参阅the next function的说明
答案 3 :(得分:3)
对于忽略__pairs
元方法的更快版本:
local next = next
local k = next(tab)
while k ~= nil do
tab[k] = nil
k = next(tab, k)
end
编辑:正如@siffiejoe在评论中提到的那样,可以通过将pairs
调用替换为表的默认返回值来简化为for循环:next
方法和表本身。此外,要避免使用所有元方法,请使用rawset
方法进行表索引分配:
for k in next, tab do rawset(tab, k, nil) end
答案 4 :(得分:0)
#table
是表格大小,因此如果t = {1,2,3}
则#t = 3
因此您可以使用此代码删除元素
while #t ~= 0 do rawset(t, #t, nil) end
您将浏览表并删除每个元素,最后得到一个空表。