亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Lua的table庫函數insert、remove、concat、sort詳細介紹

2024-07-21 23:04:42
字體:
來源:轉載
供稿:網友

函數列表:

table.insert(table,[ pos,] value)
table.remove(table[, pos])
table.concat(table[, sep[, i[, j]]])
table.sort(table[, comp])

1. insert 和 remove 只能用于數組元素的插入和移出, 進行插入和移出時,會將后面的元素對齊起來。

    所以在 for 循環中進行 insert 和 remove 的時候要注意插入和移除時是否漏掉了某些項:
 

復制代碼 代碼如下:

        local t = {1,2,3,3,5,3,6}
        for i,v in ipairs(t) do
            if v == 3 then
                table.remove(t,i)
            end
        end
        -- 錯誤,第四個 3 沒有被移除,ipairs 內部會維護一個變量記錄遍歷的位置,remove 掉第三個數字 3 之后,ipairs 下一個返回的值是 5 而不是 3
       
        local t = {1,2,3,3,5,3,6}
        for i=1, #t do
            if t[i] == 3 then
                table.remove(t,i)
                i = i-1
            end
        end
        -- 錯誤,i=i-1 這段代碼沒有用,i 的值始終是從 1 到 #t,for 循環里修改 i 的值不起作用
       
        local t = {1,2,3,3,5,3,6}
        for i=#t, 1, -1 do
            if t[i] == 3 then
                table.remove(t,i)
            end
        end
        -- 正確,從后往前遍歷
       
        local t = {1,2,3,3,5,3,6}
        local i = 1
        while t[i] do
            if t[i] == 3 then
                table.remove(t,i)
            else
                i = i+1
            end
        end
        -- 正確,自己控制 i 的值是否增加
    

 

   2. concat 可以將 table 的數組部分拼接成一個字符串,中間用 seq 分隔。 
    lua 中字符串的存儲方式與 C 不一樣,lua 中的每個字符串都是單獨的一個拷貝,拼接兩個字符串會產生一個新的拷貝,如果拼接操作特別多,就會影響性能:
 

復制代碼 代碼如下:

        local beginTime = os.clock()
        local str = ""
        for i=1, 30000 do
            str = str .. i
        end
        local endTime = os.clock()
        print(endTime - beginTime)
        -- 消耗 0.613 秒,產生了 30000 個字符串拷貝,但只有最后一個是有用的

 

        local beginTime = os.clock()
        local t = {}
        for i=1, 30000 do
            t[i] = i
        end
        local str = table.concat(t, "")
        local endTime = os.clock()
        print(endTime - beginTime)
        -- 消耗 0.024 秒,利用 concat,一次性把字符串拼接出來,只產生了一個字符串拷貝
      

 

3. sort 可以將 table 數組部分的元素進行排序,需要提供 comp 函數,comp(a, b) 如果 a 應該排到 b 前面,則 comp 要返回 true 。    
    注意,對于 a==b 的情況,一定要返回 false :
 

復制代碼 代碼如下:

        local function comp(a,b)
            return a <= b
        end
        table.sort(t,comp)
        -- 錯誤,可能出現異常:attempt to compare number with nil
       
        local function comp(a,b)
            if a == nil or b == nil then
                return false
            end
            return a <= b
        end
        table.sort(t,comp)
        -- 錯誤,可能出現異常:invalid order function for sorting
        -- 也可能不報這個異常,但結果是錯誤的;
    之所以 a==b 返回true 會引發這些問題,是因為 table.sort 在實現快速排序時沒有做邊界檢測:
        for (;;) {
          while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) {  // 未檢測邊界, i 會一直增加
            if (i>=u) luaL_error(L, "invalid order function for sorting");
            lua_pop(L, 1);
          }
          while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) {  // 未檢測邊界, j 會一直減少
            if (j<=l) luaL_error(L, "invalid order function for sorting");
            lua_pop(L, 1);
          }
          if (j<i) {
            lua_pop(L, 3);
            break;
          }
          set2(L, i, j);
        }
  

    看以上代碼,如果 a==b 時返回 true 且邊界上的幾個值是相等的話, sort_comp 就無法阻止 i 繼續增長,直到超出邊界引發異常 attempt to compare number with nil;即使我們對 a 和 b 進行非空判斷,也會因為 i 超過邊界而引發異常 invalid order function for sorting
    快速排序是什么,lua 如何實現快速排序,可以參考 lua 源碼中的描述,這里不多介紹;
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人久久久久久| 亚洲人成免费电影| 日本高清久久天堂| 国产精品扒开腿做爽爽爽男男| 精品性高朝久久久久久久| 亚洲男人天堂网| 久久精品国产欧美亚洲人人爽| 97视频免费在线看| 欧美视频第一页| 欧美电影院免费观看| 欧美亚洲另类激情另类| 性色av一区二区三区红粉影视| 亚洲视频日韩精品| 国产日韩欧美在线| 欧美精品日韩www.p站| 亚洲第一精品夜夜躁人人爽| 国产欧美精品日韩| 亚洲国产精品视频在线观看| 国产日本欧美一区二区三区| 亚洲国产另类 国产精品国产免费| 日韩在线观看你懂的| 81精品国产乱码久久久久久| 亚洲午夜久久久久久久| 国产精品久久久久久久久久久久| 国产精品ⅴa在线观看h| 欧美中文字幕在线视频| 欧美在线性视频| 国产午夜精品美女视频明星a级| 亚洲国产日韩欧美综合久久| 亚洲的天堂在线中文字幕| 久久夜色精品国产欧美乱| 亚洲精品资源美女情侣酒店| 姬川优奈aav一区二区| 国产精品成人aaaaa网站| 精品偷拍各种wc美女嘘嘘| 美女福利视频一区| 中文字幕在线亚洲| 精品久久香蕉国产线看观看亚洲| 久久精品一区中文字幕| 亚洲国产精品视频在线观看| 日韩欧美精品网址| 一区二区欧美在线| 欧美巨猛xxxx猛交黑人97人| 午夜欧美大片免费观看| 欧美精品成人在线| 国产色综合天天综合网| 97视频在线观看免费| 亚洲国产欧美自拍| www.日韩av.com| 国产乱肥老妇国产一区二| 97在线视频免费| 91精品国产高清久久久久久久久| 日本三级久久久| 97久久超碰福利国产精品…| 成人免费视频网址| 欧美日韩aaaa| 国产一区二区日韩精品欧美精品| 欧洲成人午夜免费大片| 亚洲国产欧美在线成人app| 中文字幕久热精品视频在线| 清纯唯美亚洲激情| 成人在线激情视频| 日韩精品极品在线观看播放免费视频| 欧美高清电影在线看| 成人免费视频xnxx.com| 美女999久久久精品视频| 亚洲天堂第一页| 亚洲aaa激情| 久久久噜久噜久久综合| 亚洲人精品午夜在线观看| 亚洲激情国产精品| 国产精品久久久一区| 亚洲成人三级在线| 91亚洲精品在线观看| 亚洲精品之草原avav久久| 92福利视频午夜1000合集在线观看| 亚洲大胆人体视频| 91爱视频在线| 国产精品视频色| 成人午夜激情网| 亚洲一区二区在线| 亚洲一区二区黄| 亚洲美女精品久久| 亚洲欧美一区二区三区情侣bbw| 日韩av在线一区| 欧美天天综合色影久久精品| 亚洲第一国产精品| 亚洲欧美日韩精品久久奇米色影视| 亚洲视频一区二区三区| 亚洲国产精品悠悠久久琪琪| 亚洲老司机av| 精品小视频在线| 在线视频欧美日韩精品| 久久久国产精彩视频美女艺术照福利| 亚洲第一福利在线观看| 91久久精品在线| 亚洲一区美女视频在线观看免费| 粗暴蹂躏中文一区二区三区| 538国产精品视频一区二区| 国产精品中文字幕在线观看| 欧美亚洲激情视频| 久久夜色撩人精品| 一本大道香蕉久在线播放29| 中文字幕欧美在线| 国产高清视频一区三区| 欧美日韩在线观看视频小说| 国产区精品在线观看| 亚洲欧美国产高清va在线播| 国产在线98福利播放视频| 久久久中精品2020中文| 成人国产精品av| 国产精品久久久久久久久久东京| 国产精品久久久久aaaa九色| 国产精品第二页| 国产福利精品av综合导导航| 国产婷婷97碰碰久久人人蜜臀| 亚洲精品国产综合区久久久久久久| 91在线观看免费网站| 亚洲开心激情网| 久久久亚洲网站| 国产91对白在线播放| 日韩av不卡电影| 欧美激情视频一区| 黄色一区二区在线| 欧美激情女人20p| 国产手机视频精品| …久久精品99久久香蕉国产| 久久久国产精品x99av| 国产精品白嫩初高中害羞小美女| 亚洲成人网av| 精品少妇v888av| 久久久黄色av| 日韩精品在线观看一区| 亚洲自拍另类欧美丝袜| 黄色成人av网| 91亚洲va在线va天堂va国| 亚洲小视频在线| 91精品久久久久久久久久久| 午夜精品一区二区三区在线视频| 亚洲电影免费观看高清完整版| 精品毛片网大全| 国产精品久久久999| 欧美黄色免费网站| 一区二区三区日韩在线| 亚洲а∨天堂久久精品喷水| 三级精品视频久久久久| 亚洲综合第一页| 欧美人与性动交a欧美精品| 欧美成人免费全部| www.亚洲免费视频| 亚洲欧洲一区二区三区在线观看| 国产欧美日韩丝袜精品一区| 欧美第一淫aaasss性| 国产美女精彩久久| 日韩在线中文字幕| 亚洲成人激情小说| 久久久精品中文字幕| 亚洲四色影视在线观看| 亚洲欧洲美洲在线综合| 亚洲国语精品自产拍在线观看| 欧美日韩国产精品| 在线视频免费一区二区| 国产精品成人久久久久| 亚洲新声在线观看|