2011-02-02 1325 views
21

如何删除Lua表中的所有元素?我不想做的事:如何删除Lua表中的所有元素?

t = {} 
table.insert(t, 1) 
t = {} -- this assigns a new pointer to t 

我要保持相同的指针吨,但内t删除所有元素。

我想:

t = {} 
table.insert(t, 1) 
for i,v in ipairs(t) do table.remove(t, i) end 

就是上面是否有效?或者还有其他需要的东西?

+3

我想情况是清空一个表中把它作为一个参数的函数。那么这个问题很好,+1。我最初对“指针”一词感到困惑,它存在于C代码中,不应在Lua代码中提及。你的意思是“参考”或其他。 – AndersH 2011-02-03 21:13:55

回答

31
for k in pairs (t) do 
    t [k] = nil 
end 

也将工作 - 你可能有ipairs困难,如果表不作为整个数组。

13

最简单,最高效的:

for k,v in pairs(tab) do tab[k]=nil end 

你所说的其实是不可用:table.remove转移剩余的元素关闭孔,从而搅乱表遍历。见the next function说明更多信息

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 
+2

或者只是`对于下一个k,tab do tab [k] = nil end` – siffiejoe 2014-12-04 08:47:51

0

#table是表大小等,如果t = {1,2,3}然后#t = 3

所以,你可以使用此代码删除元素

while #t ~= 0 do rawset(t, #t, nil) end

您将浏览表格并删除每个元素,最后得到一个空表。

9

表元素插入和移除 性能比较

台尺寸计数千万

[1]而与rawset

while #t ~= 0 do rawset(t, #t, nil) end 

花费的时间= 0.677220

[2]下一个和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],rawset

count = #t 
for i=0, count do t[i]=nil end 

花费的时间= 0.009308

表elemnets插入

[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],rawset

for i=0, 10000000 do rawset(t, i, i) end 

花费的时间= 0.100010

结果。

最快删除:4

最快插入:3