comment supprimer tous les éléments d'une table Lua?
Question
Comment 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 souhaite conserver le même pointeur vers 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 faut-il autre chose?
La solution
for k in pairs (t) do
t [k] = nil
end
Fonctionnera également - vous pourriez avoir des difficultés avec ipairs si la table n'est pas utilisée comme un tableau partout.
Autres conseils
Les éléments de tableau insèrent et suppriment comparaison des performances
La taille de la table compte 10000000
[1] while et rawset
while #t ~= 0 do rawset(t, #t, nil) end
temps passé= 0,677220
[2] suivant 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
Insertion des éléments de table
[1] fonction d'insertion de tableau
for i=0, 10000000 do table.insert(t, i, i) end
temps passé= 1.0590489
[2] utilisez #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.
Suppression la plus rapide: 4
Insertion la 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 perturbe 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étaméthode __pairs
:
local next = next
local k = next(tab)
while k ~= nil do
tab[k] = nil
k = next(tab, k)
end
EDIT: Comme le mentionne @siffiejoe dans les commentaires, cela peut être simplifié en une boucle for en remplaçant l'appel pairs
par sa valeur de retour par défaut pour les tables: la méthode next
et la table elle-même.De plus, pour éviter toutes les métaméthodes, utilisez la méthode rawset
pour l'attribution 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 parcourrez le tableau et supprimerez chaque élément et vous obtiendrez un tableau vide à la fin.