lua遍歷table中刪除table中元素

2021-09-25 22:46:12 字數 1272 閱讀 2039

很多時候,我們有這樣的需求:刪除table中若干符合條件的元素,最原始的想法就是用for遍歷一邊table,符合條件的用table.remove就可以了

function test1(t)

for i , v in ipairs(t) do

if v.id%3 == 0 then

table.remove(t ,i)

endend

end​

結果證明這是不行的,因為table.remove刪除第i元素後,i後面的元素會向前補齊,這樣刪除前處於i+1的元素就變成了i元素,然後for迴圈從t中取第i+1個元素,這樣就漏掉了第i+1個元素,既然這樣不行,很自然的就想到用while迴圈,可以自由控制「遍歷的指標」是否前進,有刪除操作,就不前進,否則才前進

**如下

function test2(t)

local int i =1

while(t[i]) do

if t[i].id%3 == 0 then

table.remove(t , i)

else

i = i + 1

endend

end

跑一下,很正常!

但是注意table.remove是刪除佇列中的乙個元素,每一次操作都要移動大量元素,效能不會太好,因此可以考慮用臨時的table,用來儲存沒有被刪除的元素,最後再讓t指向這個table,以空間來換時間,而實際使用中,t中的元素往往是table型別,這樣臨時的table中只會儲存元素的引用,因此占用的空間幾乎可以忽略不計。

**如下

function test3(t)

local newt = {}

for i ,v in ipairs(t) do

if v.id%3 ~= 0 then

table.insert(newt , v)

endend

t= newt

end

很好奇test3()到底比test2()快多少呢,我測試了一下

t = {}

local n = 10000

for i = 1,n do

table.insert(t ,)

n是10000的情況下:

test2耗時0.234s

test3耗時0.002s

相差非常大。

結論:刪除table中的多個元素,在table較大,且刪除操作較頻繁時,切忌使用table.remove

c遍歷lua中table的方法

遍歷乙個table,肯定是不知道table的每個key的,所以lua getfield肯定是不可行的。要遍歷table,最主要的是lua next函式,該函式主要接受乙個int引數,代表當前table所在的索引,索引之上應該需要乙個key,每次lua next都會從當前的key遍歷下乙個key,於是...

lua 遍歷陣列和table

方法一,可以用for來遍歷 do table week for i 1,table week do print table week i endend 方法二 採用迭代器的方式遍歷的,i為下標,v為table或者陣列的值。do table week for i,v in pairs table we...

lua 使用remove刪除table資料

在lua語言中,一切皆是table,所有資料,函式都儲存在table中,但是當我們使用了table後,該如何清理table表中資料呢。先看乙個函式 table.remove table pos 刪除在pos位置上的元素,後面的元素會向前一棟,然後刪除的index會向前移動,導致刪除後的資料不是你想要...