質問

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top