26

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

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

4

5 に答える 5

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

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

于 2011-02-02T22:31:37.203 に答える
22

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

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

[4] for、rawset

count = #t
for i=0, count do t[i]=nil end

費やした時間=0.0009308

テーブルエレムネット挿入

【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

于 2015-06-13T06:12:58.637 に答える
14

最も簡単でパフォーマンスが高い:

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

あなたが提案することは使用できません:table.remove残りの要素をシフトして穴を閉じ、したがってテーブルトラバーサルを台無しにします。詳細については、次の関数の説明を参照してください

于 2011-02-02T22:27:13.563 に答える
3

メタメソッドを無視するより高速なバージョンの場合__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
于 2014-12-04T06:34:26.093 に答える
1

#tableテーブルのサイズなのでt = {1,2,3}#t = 3

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

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

テーブルを調べて各要素を削除すると、最後に空のテーブルが表示されます。

于 2015-06-10T02:34:52.117 に答える