原帖链接: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. spring boot 结合Redis 实现工具类

    自己整理了 spring boot 结合 Redis 的工具类引入依赖 <dependency> <groupId>org.springframework.boot</g ...

  2. mysql 中语句执行的顺序以及查询处理阶段的分析

    原文链接:http://www.php.cn/mysql-tutorials-408865.html 本篇文章给大家带来的内容是关于mysql中语句执行的顺序以及查询处理阶段的分析,有一定的参考价值, ...

  3. 20145221高其_Web安全基础实践

    20145221高其_Web安全基础实践 目录 实践目标 WebGoat BurpSuite Injection Flaws Cross-Site Scripting (XSS) 总结 实践目标 (1 ...

  4. bzoj 1818 [CQOI 2010] 内部白点 - 扫描线 - 树状数组

    题目传送门 快速的列车 慢速的列车 题目大意 一个无限大的方格图内有$n$个黑点.问有多少个位置上下左右至少有一个黑点或本来是黑点. 扫描线是显然的. 考虑一下横着的线段,取它两个端点,横坐标小的地方 ...

  5. Codeforces 40E Number Table - 组合数学

    题目传送门 传送门I 传送门II 题目大意 给定一个$n\times m$的网格,每个格子上要么填$1$,要么填$-1$,有$k$个位置上的数是已经填好的,其他位置都是空的.问有多少种填法使得任意一行 ...

  6. Codeforces 817C Really Big Numbers - 二分法 - 数论

    Ivan likes to learn different things about numbers, but he is especially interested in really big nu ...

  7. CIL锁,GIL与线程池的区别,进程池和线程池,同步与异步

    一.GIL锁 什么是GIL? 全局解释器锁,是加在解释器上的互斥锁 GC是python自带的内存管理机制,GC的工作原理:python中的内存管理使用的是应用计数,每个数会被加上一个整型的计数器,表示 ...

  8. Bootstrap3基础 form-inline 输入框在同一行

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

  9. 浅谈Log4j2日志框架及使用

    目录 1.日志框架 2.为什么需要日志接口,直接使用具体的实现不就行了吗? 3.log4j2日志级别 4.log4j2配置文件的优先级 5.对于log4j2配置文件的理解 6.对于Appender的理 ...

  10. php知识点-1

    global 是在函数内部 声明一个 函数外部的变量(即所谓的全局变量, 而所谓的超全局变量是指 像 $_POST, $GLOBALS等之类的自动系统变量) 的一个别名. 在函数内部使用 unset( ...