欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2015年06月29日 08:47:02   投稿:junjie  
這篇文章主要介紹了Lua table中安全移除元素的方法,本文給出3種實(shí)現(xiàn)方法,分別是從后往前刪除和while刪除,需要的朋友可以參考下

在Lua中,table如何安全的移除元素這點(diǎn)挺重要,因?yàn)槿绻恍⌒模瑫?huì)沒有正確的移除,造成內(nèi)存泄漏。

引子

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

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

復(fù)制代碼 代碼如下:

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


打印結(jié)果:
復(fù)制代碼 代碼如下:

1====3
2====8
3====9
4====20
5====13
6====15
7====7
8====11
[Finished in 0.0s]

有問題吧,20怎么還在?這就是在遍歷中刪除導(dǎo)致的。

如何做呢?

Let's get started!

復(fù)制代碼 代碼如下:

local test = { 'a','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)中刪除會(huì)造成一些錯(cuò)誤。這是可以建立一個(gè)remove表用來標(biāo)記將要?jiǎng)h除的,如上面例子,把將要?jiǎng)h除的標(biāo)記為true

方法1 從后往前刪除

復(fù)制代碼 代碼如下:

for i = #test, 1, -1 do
    if remove[test[i]] then
        table.remove(test, i)
    end
end

dump(test)


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


方法2 while刪除

復(fù)制代碼 代碼如下:

 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

復(fù)制代碼 代碼如下:

 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)

相關(guān)文章

  • Lua 中 pairs 和 ipairs 的區(qū)別

    Lua 中 pairs 和 ipairs 的區(qū)別

    這篇文章主要介紹了Lua 中 pairs 和 ipairs 的區(qū)別,本文用官方文檔和代碼實(shí)例總結(jié)了它的們的區(qū)別,需要的朋友可以參考下
    2014-09-09
  • Golang使用ChatGPT生成單元測試實(shí)踐

    Golang使用ChatGPT生成單元測試實(shí)踐

    這篇文章主要為大家介紹了Golang使用ChatGPT生成單元測試實(shí)踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Lua中使用模塊的一些基礎(chǔ)知識(shí)

    Lua中使用模塊的一些基礎(chǔ)知識(shí)

    這篇文章主要介紹了Lua中使用模塊的一些基礎(chǔ)知識(shí),說明基本上都融入注釋之中,需要的朋友可以參考下
    2015-07-07
  • Lua教程(三):C語言、C++中調(diào)用Lua的Table示例

    Lua教程(三):C語言、C++中調(diào)用Lua的Table示例

    這篇文章主要介紹了Lua教程(三):C語言、C++中調(diào)用Lua的Table示例,即在C語言、C++中讀取、操作Lua的Table,需要的朋友可以參考下
    2014-09-09
  • Lua中的函數(shù)知識(shí)總結(jié)

    Lua中的函數(shù)知識(shí)總結(jié)

    這篇文章主要介紹了Lua中的函數(shù)知識(shí)總結(jié),本文講解了函數(shù)的一些基礎(chǔ)知識(shí)、多重返回值問題、變長參數(shù)、內(nèi)嵌函數(shù)等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Lua中string.len()使用指南

    Lua中string.len()使用指南

    Lua 字符串庫中的所有函數(shù)都導(dǎo)出在模塊 string 中,今天我們先來看看string.len()的使用,有需要的小伙伴可以參考下
    2016-08-08
  • 詳解Lua中的while循環(huán)語句的使用

    詳解Lua中的while循環(huán)語句的使用

    這篇文章主要介紹了詳解Lua中的while循環(huán)語句的使用,是Lua入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Lua table的concat方法使用實(shí)例

    Lua table的concat方法使用實(shí)例

    這篇文章主要介紹了Lua table的concat方法使用實(shí)例,本文講解了concat方法的用法及使用實(shí)例,需要的朋友可以參考下
    2015-04-04
  • Lua中os庫詳細(xì)介紹

    Lua中os庫詳細(xì)介紹

    這篇文章主要介紹了Lua中os庫詳細(xì)介紹,本文詳細(xì)講解了OS庫中的常用方法,分別對(duì)參數(shù)做出了解釋,有的給出了示例,需要的朋友可以參考下
    2014-11-11
  • linux系統(tǒng)安裝Nginx Lua環(huán)境

    linux系統(tǒng)安裝Nginx Lua環(huán)境

    因項(xiàng)目需求,需要在Linux系統(tǒng)下搭建一套nginx+lua的開發(fā)環(huán)境,經(jīng)過一番摸索,現(xiàn)總結(jié)如下,希望大家能夠喜歡。
    2016-12-12

最新評(píng)論