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
また、機能します-テーブルが全体として配列として使用されていない場合、ipairで問題が発生する可能性があります。
テーブル要素はパフォーマンス比較を挿入および削除します
テーブルサイズカウント10000000
[1] whileおよびrawset
while #t ~= 0 do rawset(t, #t, nil) end
費やした時間= 0.677220
[2]次およびローセット
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] for、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] for、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
メタメソッドを無視する高速バージョンの場合:
local next = next
local k = next(tab)
while k ~= nil do
tab[k] = nil
k = next(tab, k)
end
編集:@siffiejoeがコメントで言及しているように、pairs
呼び出しをテーブルのデフォルトの戻り値であるnext
メソッドとテーブル自体で置き換えることにより、これをforループに簡単に戻すことができます。さらに、すべてのメタメソッドを回避するには、テーブルインデックスの割り当てに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
テーブルを確認して各要素を削除すると、最後に空のテーブルが作成されます。