как удалить все элементы в таблице Lua?

Как удалить все элементы внутри таблицы в 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 ответов


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

также будет работать - у вас могут возникнуть трудности с ipairs, если таблица не используется в качестве массива.


самый простой и самый эффективный:

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

то, что вы предлагаете, нельзя использовать:table.remove сдвигает оставшиеся элементы, чтобы закрыть отверстие, и, таким образом, испортит обход таблицы. См. Описание для следующая функция дополнительная информация


элементы таблицы вставить и удалить производительность сравнить

количество размеров таблицы 10000000

[1] в то время как и 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 вставить

[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


для более быстрой версии, которая игнорирует __pairs метаметод:

local next = next
local k = next(tab)
while k ~= nil do
  tab[k] = nil
  k = next(tab, k)
end

EDIT: как упоминает @siffiejoe в комментариях, Это можно упростить обратно в цикл for, заменив pairs вызов с возвращаемым значением по умолчанию для таблиц:next метод и сама таблица. Кроме того, чтобы избежать всех метаметодов, используйте rawset метод присвоения индекса таблицы:

for k in next, tab do rawset(tab, k, nil) end

#table размер таблицы и так если t = {1,2,3} затем #t = 3

таким образом, вы можете использовать этот код для удаления элементов

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

вы пройдете через таблицу и удалите каждый элемент, и вы получите пустую таблицу в конце.