很多時候,我們有這樣的需求:刪除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會向前移動,導致刪除後的資料不是你想要...