lua 中删除table中的多个元素_harryptter的博客-程序员秘密

技术标签: cocos2d-x  cocos2dx  lua  游戏开发  

转载自:http://m.blog.csdn.net/blog/zxt5105515/34114555

很多时候,我们有这样的需求:删除table中若干符合条件的元素,最原始的想法就是用for遍历一边table,符合条件的用table.remove就可以了

<span style="font-size:14px;">function test1(t)
 for i , v in ipairs(t) do
   if v.id%3 == 0 then
     table.remove(t ,i)
   end
 end
end</span>

结果证明这是不行的,因为table.remove删除第i元素后,i后面的元素会向前补齐,这样删除前处于i+1的元素就变成了i元素,然后for循环从t中取第i+1个元素,这样就漏掉了第i+1个元素,既然这样不行,很自然的就想到用while循环,可以自由控制“遍历的指针”是否前进,有删除操作,就不前进,否则才前进

代码如下

<span style="font-size:14px;">function test2(t)
	local int i =1
	while(t[i]) do
		if t[i].id%3 == 0 then
			table.remove(t , i)
		else
			i = i + 1
		end
	end
end</span>

跑一下,很正常!

但是注意table.remove是删除队列中的一个元素,每一次操作都要移动大量元素,性能不会太好,因此可以考虑用临时的table,用来保存没有被删除的元素,最后再让t指向这个table,以空间来换时间,而实际使用中,t中的元素往往是table类型,这样临时的table中只会保存元素的引用,因此占用的空间几乎可以忽略不计。

代码如下

<span style="font-size:14px;">function test3(t)
	local newT = {}
	for i ,v in ipairs(t) do
		if v.id%3 ~= 0 then
			table.insert(newT , v)
		end
	end
	t= newT
end</span>

很好奇test3()到底比test2()快多少呢,我测试了一下

<span style="font-size:14px;">t = {}
local n = 10000
for i = 1,n do
table.insert(t ,{id = i})
end</span>

n是10000的情况下:

test2耗时0.234s

test3耗时0.002s

相差非常大。


结论:

删除table中的多个元素,在table较大,且删除操作较频繁时,切忌使用table.remove


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/harryptter/article/details/47321407

智能推荐

azkaban调度启动异常文档_大壮vip的博客-程序员秘密_调度启动报错

按照文档配置、启动,启动的时候报错,1、在bin下,启动./azkaban-web-start.sh报错Using Hadoop from /home/hadoop/hadoop-2.6.0Using Hive from ./..:./../lib/azkaban-2.5.0.jar:./../lib/commons-collections-3.2.1.jar:./../lib/co...

最新JetBrains PyCharm 使用教程--创建或导入项目(二)_anhe1150的博客-程序员秘密

Python简介Python是一种非常流行的开源编程语言。得益于无尽的模块选项,Python今天广泛用于脚本语言、Web开发、移动和桌面在许多领域。随着人工智能的复兴,数据科学的崛起,Python更是红火起来。因此,最流行的Python的集成开发工具JetBrains PyCharm诞生。PyCharm简介​链接:https://www.jetbrains.com/p...

go语言环境安装_帅气歪歪的博客-程序员秘密

go 语言环境搭建从零开始搭建Go语言开发环境下载下载地址Go官网下载地址:https://golang.org/dl/Go官方镜像站(推荐):https://golang.google.cn/dl/版本的选择Windows平台和Mac平台推荐下载可执行文件版,Linux平台下载压缩文件版。下图中的版本号可能并不是最新的,但总体来说安装教程是类似的。Go语言更新迭代比较快,推荐使用较新版本,体验最新特性。安装Windows安装此安装实例以 64位Win10系统安装 Go1.14.

HTML基础_魑魅~魍魉的博客-程序员秘密

HTML基础一、HTML是什么?二、HTML的基本结构三、标签3.1 认识标签

字符串是否包含字母_Laughing不够好的博客-程序员秘密

select * from tablet where  regexp_like(t.vc_code, '[a-zA-Z]');   

Zookeeper系列(一)背景介绍及基本概念_luckykapok918的博客-程序员秘密_zoopkeeper的概念

一、ZooKeeper的背景1.1 认识ZooKeeperZooKeeper---译名为“动物园管理员”。动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被动 物所观赏。为了让各种不同的动物呆在它们应该呆的地方,而不是相互串门,或是相互厮杀,就需要动物园管理员按照动物的各种习性加以分类和管理,这样我们才能更加

随便推点

Python(十三)文件一_wzj_110的博客-程序员秘密_i already to ten停机德

提示:部分内容是属于开发须知的,如果你是以一个运维人员来学习,本章节可以跳过!一、文件I/OI:input(输入) --&gt;允许程序读取外部(硬盘、光盘等存储设备)的数据!--&gt;明确谁读!数据走向:外设(键盘或文件等)---&gt;内存---存储设备!O:output(输出) --&gt;允许程序记录运行状态,将数据输出(写入)到磁盘、光盘等存储设备,一般是控...

HALCON:lines_gauss用法解析_机器视觉001的博客-程序员秘密_halcon lines_gauss

HALCON:lines_gauss用法解析lines_gauss:检测图像中的线条及其宽度,在视觉表面检测方面应用广泛。lines_gauss(Image:Lines:Sigma,Low,High,LightDark,ExtractWidth,LineModel,CompleteJunctions:)Image:输入图像; Lines:提取出的亚像素精度线...

oracle12c访问mysql_「AWEI」Oracle12c新建数据库和用户及JDBC连接_医学科普的博客-程序员秘密

原标题:「AWEI」Oracle12c新建数据库和用户及JDBC连接ORACLE 12C新特性——CDB与PDBOracle12C引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为ContainerDatabase,中文翻译为数据库容器,PDB全称...

2021-02-01_南下致君Fluoxetine的博客-程序员秘密

合并单元格的语法规范 要牢记,body是结构,tr是行标签,td是单元格标签 ,以及怎样合并也要牢记

Android-Framework:Binder全解析(二,进阶学习_m0_64604636的博客-程序员秘密_processstate::self()->getcontextobject

ServiceManager.getService//frameworks/base/core/java/android/os/ServiceManager.javapublic static IBinder getService(String name) {try {//先从缓存中查看IBinder service = sCache.get(name);if (service != null) {return service;} else {return Binder.allowBloc

seq2seq发展介绍_雾里闹的博客-程序员秘密

seq2seq发展介绍因为seq2seq相关介绍博客很多,之前只是通过博客学习,一直没有读过相关论文。虽然通过博客对seq2seq大体框架有所了解,但是对于实现细节和发展并不是很清楚。近日在学习copynet时看到使用了seq2seq作为模型的主体框架,便借此机会对细节发展进行详细了解。传统的rnn对于输入一个字符预测一个字符这种情况有着不错的使用效果,但对于翻译任务而言,源句子和目标句子常常并不有着相同长度。在这种情况下,传统的rnn将难以胜任,为了解决这个问题,在Learning Phrase Re

推荐文章

热门文章

相关标签