26

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

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

4

5 回答 5

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

也可以工作 - 如果表格始终不用作数组,您可能会遇到 ipairs 困难。

于 2011-02-02T22:31:37.203 回答
22

表格元素插入和删除性能比较

表大小计数 10000000

[1] while 和 rawset

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

花费时间 = 0.677220

[2] 下一个和原始集

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] 为,原始集

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

花费时间 = 0.009308

表元素插入

[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 i=0, 10000000 do rawset(t, i, i) end

花费时间 = 0.100010

结果。

最快移除:4

最快插入:3

于 2015-06-13T06:12:58.637 回答
14

最简单和最高效的:

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

你的建议是不可用的:table.remove移动剩余的元素来关闭这个洞,从而弄乱了表格的遍历。有关详细信息,请参阅下一个功能的说明

于 2011-02-02T22:27:13.563 回答
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
于 2014-12-04T06:34:26.093 回答
1

#table是桌子的大小,所以如果t = {1,2,3}那时#t = 3

因此,您可以使用此代码删除元素

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

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

于 2015-06-10T02:34:52.117 回答