Подтвердить что ты не робот

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

Является ли это выше допустимым? Или что-то еще нужно?

4b9b3361

Ответ 1

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

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

Ответ 2

проще всего:

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

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

Ответ 3

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

Размер таблицы 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] для, rawset

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] для, rawset

for i=0, 10000000 do rawset(t, i, i) end

потраченное время = 0.100010

результат.

Самый быстрый убрать: 4

Самая быстрая вставка: 3

Ответ 4

Для более быстрой версии, которая игнорирует метатет __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

Ответ 5

#table - размер таблицы, поэтому, если t = {1,2,3}, то #t = 3

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

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

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