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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top