質問
LUAテーブル内のすべての要素を削除するにはどうすればよいですか?やりたくない:
t = {}
table.insert(t, 1)
t = {} -- this assigns a new pointer to t
同じポインターをtに保持したいのですが、中のすべての要素を削除します t
.
私は試した:
t = {}
table.insert(t, 1)
for i,v in ipairs(t) do table.remove(t, i) end
上記は有効ですか?それとも何か他のものが必要ですか?
解決
for k in pairs (t) do
t [k] = nil
end
また、テーブルがアレイとして使用されていない場合、IPAIRSが困難になる場合があります。
他のヒント
テーブル要素は、パフォーマンスの比較を挿入して削除します
テーブルサイズ数10000000
1] whileとrawset
while #t ~= 0 do rawset(t, #t, nil) end
費やした時間= 0.677220
2]次とrawset
for k in next, t do rawset(t, k, nil) end
費やした時間= 0.344533
3] ipairsとrawset
for i, v in ipairs(t) do t[i] = nil end
費やした時間= 0.012450
4]、rawset
count = #t
for i=0, count do t[i]=nil end
費やした時間= 0.009308
テーブルリフェット挿入
1]テーブル挿入関数
for i=0, 10000000 do table.insert(t, i, i) end
費やした時間= 1.0590489
2] #Tを使用します
for i=0, 10000000 do t[#t+1] = i end
費やした時間= 0.703731
3]、rawset
for i=0, 10000000 do rawset(t, i, i) end
費やした時間= 0.100010
結果。
最速の削除:4
最速の挿入:3
最も簡単で最もパフォーマンス:
for k,v in pairs(tab) do tab[k]=nil end
あなたが提案するものは使用できません: table.remove
残りの要素をシフトして穴を閉じるため、テーブルトラバーサルを台無しにします。の説明を参照してください 次の関数 詳細については
無視するより速いバージョンの場合 __pairs
Metamethod:
local next = next
local k = next(tab)
while k ~= nil do
tab[k] = nil
k = next(tab, k)
end
編集:@siffiejoeがコメントで言及しているように、これはforループに単純化することができます。 pairs
テーブルのデフォルトの返品値で呼び出します: next
メソッドとテーブル自体。さらに、すべてのメタムソッドを避けるために、を使用します rawset
テーブルインデックスの割り当ての方法:
for k in next, tab do rawset(tab, k, nil) end
#table
テーブルのサイズです t = {1,2,3}
それから #t = 3
したがって、このコードを使用して要素を削除できます
while #t ~= 0 do rawset(t, #t, nil) end
テーブルを通り抜けて各要素を削除すると、最後に空のテーブルが表示されます。