在lua中,table如何安全的移除元素這點挺重要,因為如果不小心,會沒有正確的移除,造成記憶體洩漏。
引子比如有些朋友常常這麼做,大家看有啥問題
將test表中的偶數移除掉
複製** **如下:
local test =
for i, v in ipairs( test ) do
if v % 2 == 0 then
table.remove(test, i)
endendfor i, v zoducjvtuin ipairs( test ) do
print(i .. "====" .. v)
end列印結果:
複製** **如下:
1====3
2====8
3====9
4====20
5====13
6====15
7====7
8====11
[finished in 0.0s]
有問題吧,20怎麼還在?這就是在遍歷中刪除導致的。
如何做呢?
let's get started!
複製** **如下:
local test =
local remove =
local function dump(table)
for k, v in pairs( table ) do
print(k)
&nb print(v)
print("*********")
end
end說明:一般我們不在迴圈中刪除,在迴圈中刪除會造成一些錯誤。這是可以建立乙個remove表用來標記將要刪除的,如上面例子,把將要刪除的標記為true
方法1 從後往前刪除
複製** **如下:
for i = #test, 1, -1 do
if remove[test[i]] then
table.remove(test, i)
endenddump(test)
為什麼不從前往後,朋友們可以測試,table.remove操作後,後面的元素會往前移位,這時候後續的刪除索引對應的元素已經不是之前的索引對應的元素了。
方法2 while刪除
複製** **如下:
local i = 1
while i <= #test do
if remove[te程式設計客棧st[i]] then
table.remove(test, i)
else
i = i + 1
endend方法3 quick中提供的removeitem
複製** **如下:
function table.removeitem(list, item, removeall)
local rmcount = 0
for i = 1, #list do
if list[i - rmcount] == item then
&n程式設計客棧bsp; table.remove(list, i - rmcount)
if removeall then
rmcount = rmcount + 1
else
break
endend
endendfor k, v in pairs( remove ) do
table.removeitem(test, k)
enddump(test)
本文標題: lua table中安全移除元素的方法
本文位址:
lua中table如何安全移除元素
lua中table如何安全移除元素 ay 20,2014 4 comments 在lua中,table如何安全的移除元素這點挺重要,因為如果不小心,會沒有正確的移除,造成記憶體洩漏。比如有些朋友常常這麼做,大家看有啥問題 將test表中的偶數移除掉 local test fori,vinipairs...
lua table 元素刪除
在lua中,table移除元素出現的問題 說明 一般我們不在迴圈中刪除,在迴圈中刪除會造成一些錯誤。for i test,1 1do if remove test i then table.remove test,i end end 為什麼不從前往後,因為table.remove操作後,後面的元素會...
元素移除問題
給定乙個陣列和乙個數 該數不一定在陣列中 從陣列裡刪掉這個數字,返回剩下的陣列長度。如 a 1,2,3,4,5,要刪除數字 3,那麼返回陣列長度為 4。親愛的小夥伴們,題目是不是很簡單呢?其中,n代表陣列長度,elem代表要刪掉的元素。輸入格式 第一行輸入乙個數 n 1 n 100 接下來一行 n ...