2011-02-02 28 views
21

Jak usunąć wszystkie elementy z tabeli Lua? Nie chcę zrobić:jak usunąć wszystkie elementy w tabeli Lua?

t = {} 
table.insert(t, 1) 
t = {} -- this assigns a new pointer to t 

Chcę zachować ten sam wskaźnik do T, ale usunąć wszystkie elementy wewnątrz t.

Próbowałem:

t = {} 
table.insert(t, 1) 
for i,v in ipairs(t) do table.remove(t, i) end 

Czy powyższe ważne? A może potrzebujesz czegoś innego?

+3

Myślę, że sytuacja jest pusty stolik w funkcji biorąc go jako parametr. Wtedy pytanie jest dobre, +1. Z początku byłem zdezorientowany słowem "wskaźnik", które istnieje w kodzie c-kodu i nie powinno być wspomniane w kodzie Lua. Masz na myśli "odniesienie" lub coś takiego. – AndersH

Odpowiedz

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

będzie również działać - możesz mieć trudności z Ipairs jeśli tabela nie jest używany jako tablica całym.

13

najprostszy i najbardziej wydajnych:

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

Co proponujesz nie nadaje się do użytku: table.remove przesuwa pozostałe elementy, aby zamknąć otwór, a tym samym bałagan na przechodzenie stołowego. Zobacz opis the next function więcej informacji

3

Dla szybszej wersji, która ignoruje __pairs metamethod:

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

EDIT: Jak @siffiejoe wymienia w komentarzach, to można uprościć powrotem do pętli for zastępując połączenia pairs z domyślnie zwracana wartość dla tabel: metoda i sama tabela. Dodatkowo, aby uniknąć wszystkich metamethods, użyj metody rawset dla przypisania indeksu tabeli:

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

Lub po prostu "dla k w następnej, zakładka tab [k] = zero" – siffiejoe

0

#table jest wielkość stołu i tak jeśli t = {1,2,3} następnie #t = 3

Więc można użyć tego kodu, aby usunąć elementy

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

Przejdziesz przez stół i usuniesz każdy element, a na końcu otrzymasz pusty stolik.

9

elementów tabeli wkładać i wyjmować wydajność porównanie

rozmiaru tablicy licznika 10000000

[1], gdy i rawset

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

spędził czas = 0,677220

[2] Następna i rawset

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

spędził czas = 0,344533

[3] Ipairs i rawset

for i, v in ipairs(t) do t[i] = nil end 

spędził czas = 0.012450

[4], rawset

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

spędził czas = 0.009308

elemnets Tabela wstawić

[1] Wkładka Tabela funkcji

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

spędził czas = 1.0590489

[2] użyciu #t

for i=0, 10000000 do t[#t+1] = i end 

czasu spędzonego = 0,703731

[3], rawset

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

przebywał = 0.100010

wynik.

Najszybsza remove: 4

Najszybsza Wkładka: 3

Powiązane problemy