web-dev-qa-db-ja.com

Luaテーブルのすべての要素を削除する方法?

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

上記は有効ですか?それとも何か他に必要ですか?

23
bob
for k in pairs (t) do
    t [k] = nil
end

また、機能します-テーブルが全体として配列として使用されていない場合、ipairで問題が発生する可能性があります。

35
cbz

テーブル要素はパフォーマンス比較を挿入および削除します

テーブルサイズカウント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

17
gogothing

最も簡単で高性能:

for k,v in pairs(tab) do tab[k]=nil end

あなたが提案するものは使えません:table.removeは、残りの要素をシフトして穴を閉じるため、テーブルトラバーサルが混乱します。詳細は 次の関数 の説明を参照してください

13
jpjacobs

__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
3
bonsaiviking

_#table_はテーブルサイズなので、_t = {1,2,3}_の場合は_#t = 3_

したがって、このコードを使用して要素を削除できます

while #t ~= 0 do rawset(t, #t, nil) end

テーブルを確認して各要素を削除すると、最後に空のテーブルが作成されます。

0
gogothing