print - lua script table insert
¿Cómo eliminar todos los elementos en una tabla de Lua? (5)
¿Cómo elimino todos los elementos dentro de una tabla Lua? No quiero hacer
t = {}
table.insert(t, 1)
t = {} -- this assigns a new pointer to t
Quiero retener el mismo puntero a t, pero eliminar todos los elementos dentro de t
.
Lo intenté:
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?
Elementos de la tabla insertar y eliminar el rendimiento comparar
El tamaño de la tabla cuenta 10000000
[1] while y rawset
while #t ~= 0 do rawset(t, #t, nil) end
tiempo pasado = 0,677220
[2] siguiente y rawset
for k in next, t do rawset(t, k, nil) end
tiempo pasado = 0,344533
[3] ipairs y rawset
for i, v in ipairs(t) do t[i] = nil end
tiempo pasado = 0.012450
[4] para, rawset
count = #t
for i=0, count do t[i]=nil end
tiempo pasado = 0.009308
Insertar tabla elemnets
[1] función de inserción de tabla
for i=0, 10000000 do table.insert(t, i, i) end
tiempo pasado = 1.0590489
[2] usa #t
for i=0, 10000000 do t[#t+1] = i end
tiempo empleado = 0,703731
[3] para, rawset
for i=0, 10000000 do rawset(t, i, i) end
tiempo pasado = 0.100010
resultado.
Eliminación más rápida: 4
La inserción más rápida: 3
Más fácil y con más rendimiento:
for k,v in pairs(tab) do tab[k]=nil end
Lo que sugiere no es utilizable: table.remove
desplaza los elementos restantes para cerrar el agujero y, por lo tanto, desordena el recorrido de la tabla. Vea la descripción de la siguiente función para más información.
Para una versión más rápida que ignora el __pairs
__pairs:
local next = next
local k = next(tab)
while k ~= nil do
tab[k] = nil
k = next(tab, k)
end
EDITAR: Como @siffiejoe menciona en los comentarios, esto puede simplificarse nuevamente en un bucle for reemplazando la llamada de pairs
con su valor de retorno predeterminado para las tablas: el next
método y la tabla en sí. Además, para evitar todos los metamétodos, use el método rawset
para la asignación de índice de tabla:
for k in next, tab do rawset(tab, k, nil) end
#table
es el tamaño de la tabla y si t = {1,2,3}
entonces #t = 3
Así que puedes usar este código para eliminar los elementos.
while #t ~= 0 do rawset(t, #t, nil) end
Recorrerá la tabla, eliminará cada elemento y obtendrá una tabla vacía al final.
for k in pairs (t) do
t [k] = nil
end
También funcionará: es posible que tenga dificultades con ipairs si la tabla no se utiliza como una matriz en todo.