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

Lua的table庫函數(shù)insert、remove、concat、sort詳細(xì)介紹

 更新時(shí)間:2015年04月23日 11:12:23   投稿:junjie  
這篇文章主要介紹了Lua的table庫函數(shù)insert、remove、concat、sort詳細(xì)介紹,本文分別給出了這幾個(gè)函數(shù)的使用實(shí)例,需要的朋友可以參考下

函數(shù)列表:

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

1. insert 和 remove 只能用于數(shù)組元素的插入和移出, 進(jìn)行插入和移出時(shí),會將后面的元素對齊起來。

    所以在 for 循環(huán)中進(jìn)行 insert 和 remove 的時(shí)候要注意插入和移除時(shí)是否漏掉了某些項(xiàng):
 

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

        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
        -- 錯(cuò)誤,第四個(gè) 3 沒有被移除,ipairs 內(nèi)部會維護(hù)一個(gè)變量記錄遍歷的位置,remove 掉第三個(gè)數(shù)字 3 之后,ipairs 下一個(gè)返回的值是 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
        -- 錯(cuò)誤,i=i-1 這段代碼沒有用,i 的值始終是從 1 到 #t,for 循環(huán)里修改 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 的數(shù)組部分拼接成一個(gè)字符串,中間用 seq 分隔。 
    lua 中字符串的存儲方式與 C 不一樣,lua 中的每個(gè)字符串都是單獨(dú)的一個(gè)拷貝,拼接兩個(gè)字符串會產(chǎn)生一個(gè)新的拷貝,如果拼接操作特別多,就會影響性能:
 

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

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

        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,一次性把字符串拼接出來,只產(chǎn)生了一個(gè)字符串拷貝
      

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

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

        local function comp(a,b)
            return a <= b
        end
        table.sort(t,comp)
        -- 錯(cuò)誤,可能出現(xiàn)異常: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)
        -- 錯(cuò)誤,可能出現(xiàn)異常:invalid order function for sorting
        -- 也可能不報(bào)這個(gè)異常,但結(jié)果是錯(cuò)誤的;
    之所以 a==b 返回true 會引發(fā)這些問題,是因?yàn)?table.sort 在實(shí)現(xiàn)快速排序時(shí)沒有做邊界檢測:
        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 時(shí)返回 true 且邊界上的幾個(gè)值是相等的話, sort_comp 就無法阻止 i 繼續(xù)增長,直到超出邊界引發(fā)異常 attempt to compare number with nil;即使我們對 a 和 b 進(jìn)行非空判斷,也會因?yàn)?i 超過邊界而引發(fā)異常 invalid order function for sorting
    快速排序是什么,lua 如何實(shí)現(xiàn)快速排序,可以參考 lua 源碼中的描述,這里不多介紹;

相關(guān)文章

  • 讓你的python代碼更加pythonic(簡練、明確、優(yōu)雅)

    讓你的python代碼更加pythonic(簡練、明確、優(yōu)雅)

    這篇文章主要介紹了讓你的python代碼更加pythonic(簡練、明確、優(yōu)雅),本文講解的是一種讓代碼更加清晰、簡練、明確、優(yōu)雅的書寫方法,需要的朋友可以參考下
    2014-10-10
  • Lua中的閉包學(xué)習(xí)筆記

    Lua中的閉包學(xué)習(xí)筆記

    這篇文章主要介紹了Lua中的閉包學(xué)習(xí)筆記,閉包是可以包含自由(未綁定到特定對象)變量的代碼塊;這些變量不是在這個(gè)代碼塊內(nèi)或者任何全局上下文中定義的,而是在定義代碼塊的環(huán)境中定義(局部變量),需要的朋友可以參考下
    2014-12-12
  • Lua腳本語言簡明入門教程

    Lua腳本語言簡明入門教程

    這篇文章主要介紹了Lua腳本語言簡明入門教程,本文簡潔干練,可以讓一個(gè)有編程基礎(chǔ)的快速的學(xué)會Lua腳本語言,需要的朋友可以參考下
    2014-09-09
  • Lua學(xué)習(xí)筆記之?dāng)?shù)據(jù)結(jié)構(gòu)

    Lua學(xué)習(xí)筆記之?dāng)?shù)據(jù)結(jié)構(gòu)

    這篇文章主要介紹了Lua學(xué)習(xí)筆記之?dāng)?shù)據(jù)結(jié)構(gòu),本文講解了數(shù)組、矩陣、鏈表、隊(duì)列等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • 理解Lua中的__index和__newindex

    理解Lua中的__index和__newindex

    這篇文章主要介紹了理解Lua中的__index和__newindex,本文給出了三段代碼來講解__index和__newindex,代碼中包含詳細(xì)注釋,需要的朋友可以參考下
    2015-04-04
  • Lua學(xué)習(xí)筆記之表達(dá)式

    Lua學(xué)習(xí)筆記之表達(dá)式

    在Lua中,表達(dá)式包括:數(shù)值常量、字符串字面值、變量、單目和雙目運(yùn)算符,函數(shù)調(diào)用,也包括一些非傳統(tǒng)的函數(shù)定義和表結(jié)構(gòu)。今天我們就來詳細(xì)了解下lua中的表達(dá)式
    2015-04-04
  • Lua中的metatable詳解

    Lua中的metatable詳解

    這篇文章主要介紹了Lua中的metatable詳解,本文詳細(xì)講解了metatable的作用、定義操作符行為、為 Lua 函數(shù)庫提供支持等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究

    Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究

    這篇文章主要介紹了Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究本文講解了resume的參數(shù)、resume函數(shù)的第二個(gè)返回值、yield的返回值等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • lua閉包的理解以及表與函數(shù)的幾種表達(dá)方法

    lua閉包的理解以及表與函數(shù)的幾種表達(dá)方法

    本文首先通過具體的例子講解了Lua中閉包的概念,然后總結(jié)了閉包的應(yīng)用場合,最后探討了Lua中閉包的實(shí)現(xiàn)原理,以及l(fā)ua中表與函數(shù)的3種表達(dá)方式的匯總
    2015-08-08
  • Lua中的迭代器和泛型for實(shí)例

    Lua中的迭代器和泛型for實(shí)例

    這篇文章主要介紹了Lua中的迭代器和泛型for實(shí)例,本文還講解了無狀態(tài)迭代器,需要的朋友可以參考下
    2014-09-09

最新評論