如何删除Lua表中的所有元素?

时间:2011-02-02 21:58:30

标签: lua lua-table

如何删除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

以上是否有效?还是需要其他东西?

5 个答案:

答案 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

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