2011-02-02 16 views
21

¿Cómo elimino todos los elementos dentro de una tabla de Lua? No quiero hacer:cómo eliminar todos los elementos en una tabla de Lua?

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

que desea conservar el mismo puntero a t, pero eliminar todos los elementos dentro de t.

me trataron:

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

Es válido lo anterior? ¿O se necesita algo más?

+3

supongo la situación es vaciar una tabla en una función de tomar como parámetro. Entonces la pregunta es buena, +1. Al principio estaba confundido con la palabra "puntero", que existe en el código c y no debería mencionarse en el código Lua. Quieres decir "referencia" o algo así. – AndersH

Respuesta

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

también trabajará - usted puede tener dificultad con ipairs si la tabla no se utiliza como una matriz en todas partes.

13

más fácil y mas potente:

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

Qué sugieres no es utilizable: table.remove desplaza los elementos restantes para cerrar el orificio, y por lo tanto puede confundir el recorrido mesa. Consulte la descripción de the next function para obtener más información

3

Para una versión más rápida que ignora la __pairs metamétodo:

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

EDIT: Como @siffiejoe menciones en los comentarios, esto se puede simplificar de nuevo en un bucle mediante la sustitución de la llamada pairs con su valor por defecto valor de retorno para tablas: el método next y la tabla misma. Además, para evitar todos metamétodos, utilice el método rawset para la asignación de índice de la tabla:

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

O simplemente 'para k en la siguiente, tab tab tab [k] = nil end' – siffiejoe

0

#table es el tamaño de la tabla y por lo que si t = {1,2,3} continuación #t = 3

esta manera puede utilizar este código para eliminar los elementos

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

Pasará por la tabla y eliminará cada elemento y obtendrá una tabla vacía al final.

9

elementos de tabla insertar y quitar rendimiento comparar

El tamaño Tabla recuento 10000000

[1] mientras y rawset

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

tiempo = 0,677220

[2] siguiente y rawset

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

tiempo = 0,344533

[3] ipairs y rawset

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

tiempo = 0 gastado.012450

[4] para, rawset

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

tiempo = 0.009308

elemnets Insertar tabla

[1] tabla inserto función

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

tiempo = 1,0590489

[2] utilizan #t

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

tiempo = 0,703731

[3] para, rawset

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

tiempo = 0,100010

resultado.

remove rápidas: 4

inserto rápidas: 3

Cuestiones relacionadas