Comment puis-je supprimer tous les éléments d'une table Lua? Je ne veux pas faire:
t = {}
table.insert(t, 1)
t = {} -- this assigns a new pointer to t
Je veux conserver le même pointeur sur t, mais supprimer tous les éléments dans t
.
J'ai essayé:
t = {}
table.insert(t, 1)
for i,v in ipairs(t) do table.remove(t, i) end
Ce qui précède est-il valide? Ou est-ce que quelque chose d'autre est nécessaire?
for k in pairs (t) do
t [k] = nil
end
Cela fonctionnera également - vous pouvez avoir des difficultés avec ipairs si la table n’est pas utilisée comme un tableau.
Les éléments de table insèrent et suppriment Performances comparent
Le nombre de tailles de table 10000000
[1] while et rawset
while #t ~= 0 do rawset(t, #t, nil) end
temps passé = 0.677220
[2] next et rawset
for k in next, t do rawset(t, k, nil) end
temps passé = 0,344533
[3] ipairs et rawset
for i, v in ipairs(t) do t[i] = nil end
temps passé = 0.012450
[4] pour, rawset
count = #t
for i=0, count do t[i]=nil end
temps passé = 0,009308
Insert de table elemnets
[1] fonction d'insertion de table
for i=0, 10000000 do table.insert(t, i, i) end
temps passé = 1.0590489
[2] utilise #t
for i=0, 10000000 do t[#t+1] = i end
temps passé = 0,703731
[3] pour, rawset
for i=0, 10000000 do rawset(t, i, i) end
temps passé = 0.100010
résultat.
Retrait le plus rapide: 4
Insert le plus rapide: 3
le plus simple et le plus performant:
for k,v in pairs(tab) do tab[k]=nil end
Ce que vous suggérez n'est pas utilisable: table.remove
décale les éléments restants pour fermer le trou et gâche ainsi le parcours de la table. Voir la description de la fonction suivante pour plus d'informations
Pour une version plus rapide qui ignore la métamethod __pairs
:
local next = next
local k = next(tab)
while k ~= nil do
tab[k] = nil
k = next(tab, k)
end
EDIT: Comme @siffiejoe le mentionne dans les commentaires, cela peut être simplifié dans une boucle for en remplaçant l'appel pairs
par sa valeur de retour par défaut pour tables: la méthode next
et la table elle-même. De plus, pour éviter toutes les méthodes d'évaluation, utilisez la méthode rawset
pour l'affectation d'index de table:
for k in next, tab do rawset(tab, k, nil) end
#table
est la taille de la table et donc si t = {1,2,3}
alors #t = 3
Vous pouvez donc utiliser ce code pour supprimer les éléments
while #t ~= 0 do rawset(t, #t, nil) end
Vous allez parcourir la table et supprimer chaque élément et vous obtenez une table vide à la fin.