как удалить все элементы в таблице 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
вы пройдете через таблицу и удалите каждый элемент, и вы получите пустую таблицу в конце.