как удалить все элементы в таблице Lua? - PullRequest
23 голосов
/ 03 февраля 2011

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

35 голосов
/ 03 февраля 2011
for k in pairs (t) do
    t [k] = nil
end

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

15 голосов
/ 13 июня 2015

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

Таблица размеров 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

Таблица вставки elemnets

[1] функция вставки таблицы

for i=0, 10000000 do    table.insert(t, i, i) end

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

[2] use # 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

13 голосов
/ 03 февраля 2011

самый простой и самый производительный:

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

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

3 голосов
/ 04 декабря 2014

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

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

РЕДАКТИРОВАТЬ: Как @siffiejoe упоминает в комментариях, это можно упростить обратно в цикл for, заменив вызов pairsс возвращаемым значением по умолчанию для таблиц: метод next и сама таблица.Кроме того, чтобы избежать всех метаметодов, используйте метод rawset для назначения индекса таблицы:

for k in next, tab do rawset(tab, k, nil) end
0 голосов
/ 10 июня 2015

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

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

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

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

...