原帖链接:http://www.jb51.net/article/64711.htm#comments

有增注标识的地方为额外注释,非原帖内容。

函数列表:(增注:只能用于数组!)

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

1. insert 和 remove 只能用于数组元素的插入和移出, 进行插入和移出时,会将后面的元素对齐起来。

(增注:和C++里对std::vector等容器使用iterator迭代器进行删除类似)

所以在 for 循环中进行 insert 和 remove 的时候要注意插入和移除时是否漏掉了某些项:

        local t = {,,,,,,} 

        for i,v in ipairs(t) do 

            if v ==  then 

                table.remove(t,i) 

            end 

        end 

        -- 错误,第四个 3 没有被移除,ipairs 内部会维护一个变量记录遍历的位置,remove 掉第三个数字 3 之后,ipairs 下一个返回的值是 5 而不是 3 

        

        local t = {,,,,,,} 

        for i=, #t do 

            if t[i] ==  then 

                table.remove(t,i) 

                i = i- 

            end 

        end 

        -- 错误,i=i-1 这段代码没有用,i 的值始终是从 1 到 #t,for 循环里修改 i 的值不起作用 

        

        local t = {,,,,,,} 

        for i=#t, , - do 

            if t[i] ==  then 

                table.remove(t,i) 

            end 

        end 

        -- 正确,从后往前遍历 

        

        local t = {,,,,,,} 

        local i =  

        while t[i] do 

            if t[i] ==  then 

                table.remove(t,i) 

            else 

                i = i+ 

            end 

        end 

        -- 正确,自己控制 i 的值是否增加

2. concat 可以将 table 的数组部分拼接成一个字符串,中间用 seq 分隔。

(增注:对字符串的操作,一定要避免使用..符号!可以使用string.format进行操作,性能上比..要高得多)
    lua 中字符串的存储方式与 C 不一样,lua 中的每个字符串都是单独的一个拷贝,拼接两个字符串会产生一个新的拷贝,如果拼接操作特别多,就会影响性能

        local beginTime = os.clock() 

        local str = "" 

        for i=,  do 

            str = str .. i 

        end 

        local endTime = os.clock() 

        print(endTime - beginTime) 

        -- 消耗 0.613 秒,产生了 30000 个字符串拷贝,但只有最后一个是有用的
        local beginTime = os.clock()         local t = {}         for i=, 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, , ++i), sort_comp(L, -, -)) {  // 未检测边界, i 会一直增加 

            if (i>=u) luaL_error(L, "invalid order function for sorting"); 

            lua_pop(L, ); 

          } 

          while (lua_rawgeti(L, , --j), sort_comp(L, -3, -1)) {  // 未检测边界, j 会一直减少 

            if (j<=l) luaL_error(L, "invalid order function for sorting"); 

            lua_pop(L, ); 

          } 

          if (j<i) { 

            lua_pop(L, ); 

            break; 

          } 

          set2(L, i, j); 

        } 

增注:下面为正确的写法(这里省略了b == nil)

        local function comp(a,b) 

            if a == nil or a == b then 

                return false 

            end 

            return a < b 

        end 

        table.sort(t,comp) 

(转)Lua的table库函数insert、remove、concat、sort详细介绍的更多相关文章

  1. Lua的table库函数insert、remove、concat、sort详细介绍(转载)

    函数列表: table.insert(table,[ pos,] value) table.remove(table[, pos]) table.concat(table[, sep[, i[, j] ...

  2. Lua 之table库

    标准table库 table.concat(table, sep,  start, end) concat是concatenate(连锁, 连接)的缩写,table.concat()函数列出参数中指定 ...

  3. lua的table库中经常使用的函数

    lua提供了一些辅助函数来操作table. 比如,从list中insert和remove元素,对array的元素进行sort.或者concatenate数组中的全部strings.以下就具体地解说这些 ...

  4. Lua之table

    Lua table(表) 参考:http://www.runoob.com/lua/lua-tables.html table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数字.字典 ...

  5. lua 12 table 的使用

    转自:http://www.runoob.com/lua/lua-tables.html table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组.字典等. Lua table ...

  6. lua的table库中的常用函数总结

    table是Lua语言中的一种重要的数据类型, table 的一些特性简单列举如下: (1).table 是一个“关联数组”,数组的索引可以是数字或者是字符串; (2).table 的默认初始索引一般 ...

  7. lua的table表去重

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321  我的个人博客 方法一 用过lua的人都知道,lua的table中不允许存在相同的key,利用这个思想,我们可以将原始table ...

  8. lua的table表处理 及注意事项

    lua,一款很轻量级很nice很强大的脚本语言,做为lua中使用最为频繁的table表,在使用之时还是有颇多的好处与坑的: 下面是大牛 云风的一片关于lua table的blog,可使得对lua ta ...

  9. lua中 table 元表中元方法的重构实现

    转载请标明出处http://www.cnblogs.com/zblade/ lua作为游戏的热更新首选的脚本,其优势不再过多的赘述.今天,我主要写一下如何重写lua中的元方法,通过自己的重写来实现对l ...

随机推荐

  1. 那些不错的 [ Html5 + CSS3 + Canvas ] 效果!

    apng制作工具:http://isparta.github.io/how.html apng制作文章:http://isux.tencent.com/introduction-of-apng.htm ...

  2. 18种CSS3loading效果完整版

    今天把之前分享的两篇博客<CSS3实现10种Loading效果>和 <CSS3实现8种Loading效果[二]>整理了一下.因为之前所分享的各种loading效果都只是做了we ...

  3. ODAC(V9.5.15) 学习笔记(四)TCustomDADataSet(2)

    2.连接相关 名称 类型 说明 Connection 指向一个数据库连接对象 Disconnected 设置为True将在数据库关闭后继续保持数据集的开启状态. 3. 数据获取 名称 类型 说明 Fe ...

  4. Bootstrap3基础 disabled 多选框 鼠标放在方框与文字上都出现禁止 标识

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

  5. 【做题】51NOD1518 稳定多米诺覆盖——容斥&dp

    题意:求有多少种方案,用多米诺骨牌覆盖一个\(n\times m\)的棋盘,满足任意一对相邻行和列都至少有一个骨牌横跨.对\(10^9+7\)取模. \(n,m \leq 16\) 首先,这个问题的约 ...

  6. Mysql的timestamp字段默认值设置问题

    参考: https://www.cnblogs.com/mxwz/p/7520309.html https://www.jb51.net/article/50878.htm https://blog. ...

  7. LOJ6283 数列分块入门7(分块)

    pushdown的addtag[x]打成addtag[i],结果WA了一次 #include <cstdio> #include <algorithm> #include &l ...

  8. (zhuan) 一些RL的文献(及笔记)

    一些RL的文献(及笔记) copy from: https://zhuanlan.zhihu.com/p/25770890  Introductions Introduction to reinfor ...

  9. Ubuntu关机时间过长,总是停在logo界面

    有时候我们总能遇到ubuntu关机的时候卡住,无法关机,一查看发现是" a stop job is running..." 然后后面接着一串等待时间. 这时候我们需要修改一下sys ...

  10. Win10下Java开发环境配置

    首先下载符合操作系统版本的jdk,比如64位的JDK8: 下载链接:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-down ...