2011-02-02 1318 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