亚洲免费人人妻人人,cao78在线视频,福建一级毛片,91精品视频免费观看,高清另类图片操逼,日本特黄特色大片免费看,超碰欧美人人澡曰曰澡夜夜泛

Lua table中安全移除元素的方法 -電腦資料

電腦資料 時間:2019-01-01 我要投稿
【m.msguai.com - 電腦資料】

    這篇文章主要介紹了Lua table中安全移除元素的方法,本文給出3種實現(xiàn)方法,分別是從后往前刪除和while刪除,需要的朋友可以參考下

    在Lua中,table如何安全的移除元素這點挺重要,因為如果不小心,會沒有正確的移除,造成內(nèi)存泄漏,

Lua table中安全移除元素的方法

    引子

    比如有些朋友常常這么做,大家看有啥問題

    將test表中的偶數(shù)移除掉

    代碼如下:

    local test = { 2, 3, 4, 8, 9, 100, 20, 13, 15, 7, 11}

    for i, v in ipairs( test ) do

    if v % 2 == 0 then

    table.remove(test, i)

    end

    end

    for i, v in 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 = { ‘a(chǎn)‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,‘o‘,‘p‘ }

    local remove = { a = true, b = true, c = true, e = true, f = true, p = true }

    local function dump(table)

    for k, v in pairs( table ) do

    print(k)

    print(v)

    print("*********")

    end

    end

    說明:一般我們不在循環(huán)中刪除,在循環(huán)中刪除會造成一些錯誤,

電腦資料

Lua table中安全移除元素的方法》(http://m.msguai.com)。這是可以建立一個remove表用來標記將要刪除的,如上面例子,把將要刪除的標記為true

    方法1 從后往前刪除

    代碼如下:

    for i = #test, 1, -1 do

    if remove[test[i]] then

    table.remove(test, i)

    end

    end

    dump(test)

    為什么不從前往后,朋友們可以測試,table.remove操作后,后面的元素會往前移位,這時候后續(xù)的刪除索引對應的元素已經(jīng)不是之前的索引對應的元素了。

    方法2 while刪除

    代碼如下:

    local i = 1

    while i <= #test do

    if remove[test[i]] then

    table.remove(test, i)

    else

    i = i + 1

    end

    end

    方法3 quick中提供的removeItem

    代碼如下:

    function table.removeItem(list, item, removeAll)

    local rmCount = 0

    for i = 1, #list do

    if list[i - rmCount] == item then

    table.remove(list, i - rmCount)

    if removeAll then

    rmCount = rmCount + 1

    else

    break

    end

    end

    end

    end

    for k, v in pairs( remove ) do

    table.removeItem(test, k)

    end

    dump(test)

最新文章