【玩转cocos2d-x之二十五】数据结构CCArray

2023-05-16

原创作品,转载请标明http://blog.csdn.net/jackystudio/article/details/16938787


CCArray是从cocos2d中移植过来的,类似于Apple的NSMutableArray,但是比NSMutableArray更为的好用。要注意的是虽然CCArray和CCDictionary可以管理cocos2d-x中绝大多数的类,但是仍然无法替代STL库,STL库更为强有力。


1.API

先看一下CCArray可以帮我们做什么。

1.1.创建

[cpp]  view plain copy
  1. //创建array  
  2. static CCArray* create();  
  3. //使用一系列CCObject创建array  
  4. static CCArray* create(CCObject* pObject, …);  
  5. //使用一个CCObject创建array  
  6. static CCArray* createWithObject(CCObject* pObject);  
  7. //创建array并设置容量  
  8. static CCArray* createWithCapacity(unsigned int capacity);  
  9. //用一个已存在的array创建另一个array  
  10. static CCArray* createWithArray(CCArray* otherArray);  

1.2.添加

[cpp]  view plain copy
  1. //添加一个元素  
  2. void addObject(CCObject* object);  
  3. //添加一个已存在array中所有元素  
  4. void addObjectsFromArray(CCArray* otherArray);  
  5. //在指定位置插入元素  
  6. void insertObject(CCObject* object, unsigned int index);  

1.3.删除

[cpp]  view plain copy
  1. //移除最后一个元素  
  2. void removeLastObject(bool bReleaseObj = true);  
  3. //移除某个元素  
  4. void removeObject(CCObject* object, bool bReleaseObj = true);  
  5. //移除一个指定位置的元素  
  6. void removeObjectAtIndex(unsigned int index, bool bReleaseObj = true);  
  7. //移除某个array  
  8. void removeObjectsInArray(CCArray* otherArray);  
  9. //移除所有元素  
  10. void removeAllObjects();  
  11. //快速移除某个元素  
  12. void fastRemoveObject(CCObject* object);  
  13. //快速移除某个指定位置的元素  
  14. void fastRemoveObjectAtIndex(unsigned int index);  


1.4.操作元素

[cpp]  view plain copy
  1. //返回元素个数  
  2. unsigned int count() const;  
  3. //返回array容量  
  4. unsigned int capacity() const;  
  5. //返回指定CCObject的位置,如果不存在返回UINT_MAX  
  6. unsigned int indexOfObject(CCObject* object) const;  
  7. //返回指定位置的CCObject  
  8. CCObject* objectAtIndex(unsigned int index);  
  9. //返回最后一个元素  
  10. CCObject* lastObject();  
  11. //返回随机元素  
  12. CCObject* randomObject();  
  13. //返回某个元素是否存在于array中  
  14. bool containsObject(CCObject* object) const;  
  15. //判断array是否相等  
  16. bool isEqualToArray(CCArray* pOtherArray);  

1.5.操作array内容

[cpp]  view plain copy
  1. //交换2个元素  
  2. void exchangeObject(CCObject* object1, CCObject* object2);  
  3. //交换2个指定位置元素  
  4. void exchangeObjectAtIndex(unsigned int index1, unsigned int index2);  
  5. //用一个对象替代指定位置元素  
  6. void replaceObjectAtIndex(unsigned int uIndex, CCObject* pObject, bool bReleaseObject = true);  
  7. //反转array  
  8. void reverseObjects();  
  9. //收缩array内存以匹配元素个数  
  10. void reduceMemoryFootprint();  


2.remove和fastremove

从1.3可以看出删除有两种方式,普通删除和快速删除,它们有什么区别呢?


2.1.普通删除

[cpp]  view plain copy
  1. //普通删除  
  2. void ccArrayRemoveObjectAtIndex(ccArray *arr, unsigned int index, bool bReleaseObj/* = true*/)  
  3. {  
  4.     CCAssert(arr && arr->num > 0 && index < arr->num, "Invalid index. Out of bounds");  
  5.     //删除元素内容,位置仍保留着  
  6.     if (bReleaseObj)  
  7.     {  
  8.         CC_SAFE_RELEASE(arr->arr[index]);  
  9.     }  
  10.     //长度减1  
  11.     arr->num--;  
  12.     //获得要删除的元素后的元素个数  
  13.     unsigned int remaining = arr->num - index;  
  14.     if(remaining>0)  
  15.     {  
  16.         //将要删除元素后的所有元素逐个向前移动  
  17.         memmove((void *)&arr->arr[index], (void *)&arr->arr[index+1], remaining * sizeof(CCObject*));  
  18.     }  
  19. }  

2.2.快速删除

[cpp]  view plain copy
  1. //快速删除  
  2. void ccArrayFastRemoveObjectAtIndex(ccArray *arr, unsigned int index)  
  3. {  
  4.     //删除元素内容,位置仍保留着  
  5.     CC_SAFE_RELEASE(arr->arr[index]);  
  6.     //获取最后一个元素  
  7.     unsigned int last = --arr->num;  
  8.     //把最后一个元素插到删除元素的位置上  
  9.     arr->arr[index] = arr->arr[last];  
  10. }  

2.3.总结

如果有array={0,1,2,3,4,5},如果要删除3,使用普通删除得到的结果{0,1,2,4,5},使用快速删除得到的结果是{0,1,2,5,4}。可以看出快速删除的效率比普通删除效率高,就差在移动元素的时间复杂度上。


3.内存分配


3.1.容量和个数

CCArray中容量和个数并不是同一个概念。个数<=容量。从添加元素的源码中可以看到在添加之前会先进行空间分配,所以它是一个动态分配内存的过程。如下

[cpp]  view plain copy
  1. void ccArrayEnsureExtraCapacity(ccArray *arr, unsigned int extra)//确保有额外的空间  
  2. {  
  3.     while (arr->max < arr->num + extra)//判断空间是否足够  
  4.     {  
  5.         ccArrayDoubleCapacity(arr);//增加一倍空间  
  6.     }  
  7. }  
所以,每次CCArray在插入数据时检测到空间不足会增加一倍空间,再进行检测,直到空间满足分配为止。


3.2.判等

判断2个CCArray是否相等使用isEqualToArray(),判断相等的条件是CCArray中的每个元素相等即可,与CCArray的容量无关。

4.效率

比起NSMutableArray,CCArray效率能高出10%左右,原因有三:

(1)它使用的是C接口,所以它不有Objective-C消息开销。

(2)它假定你知道你在做什么,所以它不花时间在安全检查上(如边界溢出,空间需求等)。

(3)在比较上使用了指针而不是isEqual。

除了CCArray,我们还看到了ccCArray,CCArray基本上都是调用了ccCArray的函数,为什么要分为2种?

仔细看一下CCArray是继承于CCObject,所以CCArray是用于处理cocos2d-x对象的,内存管理上也有cocos2d-x的autorelease等诸多特性。而ccCArray可以直接操作标准的C数据结构和类型。


5.CCARRAY_FOREACH和CCARRAY_FOREACH_REVERSE

宏定义,用于正向遍历和反向遍历CCArray元素

[cpp]  view plain copy
  1. #define CCARRAY_FOREACH(__array__, __object__)                                                                         \  
  2.     if ((__array__) && (__array__)->data->num > 0)                                                                     \  
  3.     for(CCObject** __arr__ = (__array__)->data->arr, **__end__ = (__array__)->data->arr + (__array__)->data->num-1;    \  
  4.     __arr__ <= __end__ && (((__object__) = *__arr__) != NULL/* || true*/);                                             \  
  5.     __arr__++)  
  6.   
  7. #define CCARRAY_FOREACH_REVERSE(__array__, __object__)                                                                  \  
  8.     if ((__array__) && (__array__)->data->num > 0)                                                                      \  
  9.     for(CCObject** __arr__ = (__array__)->data->arr + (__array__)->data->num-1, **__end__ = (__array__)->data->arr;     \  
  10.     __arr__ >= __end__ && (((__object__) = *__arr__) != NULL/* || true*/);                                              \  
  11.     __arr__--)  


6.示例

CCArray的使用示例在http://blog.csdn.net/jackystudio/article/details/11917875此文中有比较典型的应用,这里就不再详述。


7.注意

一般来说,CCArray不会被add到其他类,所以它的引用计数是1,而且被设置为自动释放。所以创建CCArray对象时要记得调用retain,而且在析构的时候也要调用release来释放内存。真心想吐槽。。。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【玩转cocos2d-x之二十五】数据结构CCArray 的相关文章

  • 算法复习 转帖

    第一阶段 xff1a 练经典常用算法 xff0c 下面的每个算法给我打上十到二十遍 xff0c 同时自己精简代码 xff0c 因为太常用 xff0c 所以要练到写时不用想 xff0c 10 15分钟内打完 xff0c 甚至关掉显示器都可以把
  • Ubuntu下的截图软件Deepin Scrot

    lt style type 61 34 text css 34 gt lt 64 page margin 0 79in p margin bottom 0 08in gt lt style gt Ubuntu12 04 自带的截图软件 sc
  • [转贴]ubuntu基础入门,好贴要转

    安装 xff1a 配置 xff1a AMD xff08 939 xff09 3500 xff0c 升技av8 xff08 k8t800pro xff09 xff0c 创见1GBddr400 xff0c 希捷250GB xff08 IDE x
  • 运用Scrum做项目管理真实案例之五

    引言 xff1a 我会以系列文章的形式跟踪记录我现在正在做的一个完整运用Scrum管理项目的笔记 xff0c 里面会有一些经验教训总结心得 xff0c 以便读者与我互相学习勉励 有写的不对的或者写的不好的地方还请海涵 xff0c 当然我更希
  • 用C#打造自己的实体转换器

    说明 尽管随着NoSQL的普及 xff0c 数据库访问的性能已经非常关注的重点了 xff08 可以通过架构来解决这个瓶颈 xff09 xff0c 所以有越来越多的项目使用了ORM来访问和操作数据库 xff0c 在周公的博客上有一个系列的文章
  • Java工程师考试题

    Java工程师考试题 一 填空题 xff08 本大题10小题 xff0c 每小题2分 xff0c 共20分 xff09 1 当Java对象不再被引用变量引用时 时 将被垃圾回收器回收 2 用POS方法的HTTP包 xff0c HTTP头与P
  • 云原生|kubernetes|ingress-nginx插件部署(kubernetes-1.23和最新版controller-1.6.4)

    前言 xff1a ingress是kubernetes内的一个重要功能插件 xff0c 这个使得服务治理成为一个可能 xff0c 当然 xff0c 结合微服务更为妥当了 不管是什么插件 xff0c 还是服务 xff0c 第一步当然是要能顺利
  • 企业私有云

    企业私有云 企业私有云 xff08 Private Cloud xff09 的定义 xff1a 针对特定的企业 组织和团体提供云服务 xff0c 不对外开放的云计算数据中心 企业私有云的特点 xff1a 1 用户拥有完整的云计算IT系统 x
  • 关于linux下VNC服务的一些介绍(本文章是基于tigervnc)

    一 为什么要写这篇文章 近期在项目上遇到一个很尴尬的现象 xff0c 项目上唯一的一台跳板机不能通过堡垒机进行VNC登录了 xff0c 该跳板机平时用于访问内网web界面做测试 xff1b 但是跳板机内部的VNC服务和端口都正常 xff08
  • Java对象类型转换:向上转型和向下转型

    将一个类型强制转换成另一个类型的过程被称为类型转换 对象类型转换 xff0c 是指存在继承关系的对象 xff0c 不是任意类型的对象 当对不存在继承关系的对象进行强制类型转换时 xff0c 会抛出 Java 强制类型转换 xff08 jav
  • 华为云服务器(linux系统)完整配置流程(包含jdk、Tomcat配置、网页配置等)

    去年华为云服务器做活动 xff0c 白嫖了一个弹性云服务器 xff0c 一直没有用 xff0c 今天着手来配置一下 xff0c 不然要过期了 一边配置一边记录流程 xff0c 亲测有效哦 xff01 首先 xff0c 需要安装一个远程登陆软
  • sql获取两个时间戳之间的时间差以及报错 [Err] 1292 - Truncated incorrect time value: '932:13:47'

    前段时间再项目开发过程中写到一个update语句 xff0c 需求两个时间戳之差作为where条件但是用了 HOUR TIMEDIFF expr1 expr2 方法成功了 UPDATE work order complaint SET 96
  • HTML5 基础知识总结(全)

    文章目录 1 文档类型2 字符集3 标签 lt h1 gt 到 lt h6 gt 4 文本格式化标签 xff08 熟记 xff09 5 标签属性6 图像标签img7 链接标签8 锚点定位9 base标签10 特殊字符11 注释标签12 相对
  • IntelliJ IDEA集成maven

    一 idea中maven的配置 1 maven配置 首先需要在idea中对maven进行集成 xff0c 目录为File Setting Build Execution Deployment Build Tools maven xff0c
  • centos7防火墙配置详细(转载)

    一 条件防火墙是开启的 systemctl start firewalld 1 查看防火墙的配置 firewall cmd state firewall cmd list all 2 开放80端口 firewall cmd permanen
  • JAVA简单快速排序讲解

    首先 xff0c 我们来了解一下什么是快速排序 xff1a 所谓快速排序 xff0c 就是在冒泡排序的基础上进行改进 xff0c 延伸出来的一种跳跃性的排序方法 xff0c 我们都知道 xff0c 冒泡排序 xff0c 就是相邻两个数之间进
  • 基于 CentOS7 的 KVM 部署 + 虚拟机创建

    目录 一 实验环境二 部署 KVM三 创建虚拟机四 远程管理 KVM 虚拟机FAQ 一 实验环境 实验环境 xff1a VMware Workstation 16 Pro 打开虚拟机之前 xff0c 首先开启 VMware Workstat
  • 云原生|kubernetes|网络插件flannel二进制部署和calico的yaml清单部署总结版

    前言 xff1a 前面写了一些关于calico的文章 xff0c 但感觉好像是浅尝辄止 xff0c 分散在了几篇文章内 xff0c 并且很多地方还是没有说的太清楚云原生 kubernetes kubernetes的网络插件calico和fl
  • 在PROC程序中出现 "error: break statement not within loop or switch" 的原因。

    今天碰到一个问题 xff0c 如果proc预编译后生成的 c文件中有下面代码 xff1a if sqlca sqlcode 61 61 1403 break 如果在gcc编译时出现 error break statement not wit
  • Ubuntu18.04下ROS安装

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 Ubuntu操作系统版本对应二 安装ROS1 换源2 添加国内源3 设置密钥4 安装ROS5 初始化 rosdepc6

随机推荐

  • jdbc连接MySQL数据库的简单应用

    jdbc连接MySQL数据库和连接Oracle数据库大体步骤一样 xff0c 首先加载数据库驱动包 xff0c 然后创建数据库连接 xff0c 接着执行sql语句 xff0c 最后返回结果集 但连接MySQL我们需要导入的驱动包是mysql
  • Matlab学习笔记4——readtable

    Matlab学习笔记4 readtable 基于文件创建表 xff0c 第一行就作为表头 xff0c 如果取的表头符合matlab的命名规则 xff0c 那么该列直接如此命名 语法 T 61 readtable filename T 61
  • 【Mysql细节】插入日期数据报格式错误:Data truncation: Incorrect datetime value

    看图吧 xff1a 为什么会在插入的第四条数据报格式错误呢 xff1f 首先这些插入数据是直接复制的 xff08 不是纯手写 xff09 看到报错第一反应是不是觉得自己的数据格式有问题啊 xff0c 细看又没有发现有啥问题 那我是如何解决的
  • 联合索引的最左前缀匹配原则

    目录 联合索引 最左前缀匹配原则 最左匹配原则的成因 联合索引 所谓的联合索引就是指 xff0c 由两个或以上的字段共同构成一个索引 本文测试用例的数据表结构如下 xff0c 一张简简单单的学生信息表 tb student xff0c 仅包
  • KEIL下载程序失败系列问题

    发现问题 xff1a 例如 xff1a 当你使用keil下载程序时 xff0c 往往会出现以下类似问题 xff0c 下面带你解决问题 1 电源 xff1a one 首先 xff0c 当你做嵌入式方面工作 xff0c 出了问题重中之重就是检查
  • js各进制之间的相互转换

    size 61 medium 十进制转二进制 parseInt num toString 2 十进制转八进制parseInt num toString 8 十进制转十六进制parseInt num toString 16 二进制转十进制pa
  • linux|奇怪的知识---账号安全加固,ssh安全加固

    前言 xff1a 一般情况下 xff0c 我们对于账号的安全是比较随意的 xff0c 因为在生产环境里 xff0c 基本都是使用堡垒机这样的带有安全审计功能的工具对各个主机进行监控 xff0c 管理 xff0c 并且结合prometheus
  • Python 自学笔记

    前言 此Python3笔记仅为本人自学网络教学视频总结的笔记 xff0c 初衷仅为个人的学习和复习使用 xff0c 本人使用的编译器为Pycharm xff0c 内容仅供参考 xff08 俺是小白 xff0c 有不对的地方希望各位大佬指出
  • libcli工具的使用-命令行修改输入参数

    libcli工具的使用 命令行修改输入参数 libcli工具介绍 Libcli 提供了一个共享的 C 库 xff0c 用于将类似 Cisco 的命令行界面包含到其他软件中 它是一个 telnet 接口 xff0c 支持用户可定义的功能树的命
  • STM32无法连接JLink(Flash读写保护) 解决方法

    By Ailson Jack Date 2020 12 12 个人博客 xff1a 首页 说好一起走 本文在我博客的地址是 xff1a STM32无法连接JLink Flash读写保护 解决方法 说好一起走 xff0c 排版更好 xff0c
  • Softmax到AMSoftmax(附可视化代码和实现代码)

    Softmax nbsp 个人理解 在训练的时候 加上角度margin 把预测出来的值减小 往0那里挤压 离标注距离更大 减少训练得分 加大loss 增加训练收敛难度 不明白的有个问题 减去m后 如果出现负数怎么办 nbsp nbsp 以下
  • linux python保存mp4

    解决 python调用OpenCV 保存视频时使用 avc1 格式出现 Could not find encoder for codec id 27 Encoder not found的错误 此错误不能保存视频文件 以及使用 mpeg 格式
  • 在树莓派4B安装 scipy 笔记,不需要删除numpy,不需要mkl

    在树莓派4B安装 scipy 笔记 xff0c 不需要删除numpy xff0c 不需要mkl 参考官网 xff1a 不要用sudo xff0c 带上 user xff0c 否则有问题 xff0c 官网 最好用pip安装 python sp
  • LINUX基础试题大全(4)

    说明 xff1a 此文章由于题数庞大 xff0c 为方便阅读本人将其分为四篇文章为大家分享 xff01 答案会今后不断进行更新 xff01 LINUX基础试题大全 xff08 1 xff09 填空题题 LINUX基础试题大全 xff08 2
  • Oracle 创建用户

    span class token comment 查看表空间 span span class token keyword select span span class token operator span span class token
  • Win10 (mstsc)局域网远程桌面连接,超全面设置。(附带,外网远程连接mstsc)

    TCP IP xff08 Transmission Control Protocol Internet Protocol xff0c 传输控制协议 网际协议 xff09 是指能够在多个不同网络间实现信息传输的协议簇 TCP IP协议不仅仅指
  • postgresql |数据库 |数据库的常用备份方法总结

    前言 xff1a 数据库的重要性就不需要在这里重复了 xff0c 那么 xff0c 不管是测试环境 xff0c 还是开发环境 xff0c 亦或者是生产环境 xff0c 数据库作为系统内 xff08 项目内 xff09 的一个非常重要的组件
  • USB连接到centos7虚拟机出现错误(VMware USB Arbitration Service无法启动)

    USB连接到centos7虚拟机出现错误 有可能是因为VMware USB Arbitration Service出现无法自启动的问题 windows主机中WIN 43 R打开运行界面 xff0c 输入 接着查看VMware USB Arb
  • Centos7下配置网卡网桥

    简介 xff1a Linux系统下开启虚拟机需要配置网桥 xff0c 从而使得Linux系统里虚拟化软件的虚拟交换机与宿主机的物理网卡绑定一起 虚拟机与宿主机互相独立的IP 物理网卡监听这些IP xff0c 从而达到虚拟机与物理机在同一个局
  • 【玩转cocos2d-x之二十五】数据结构CCArray

    原创作品 xff0c 转载请标明 xff1a http blog csdn net jackystudio article details 16938787 CCArray是从cocos2d中移植过来的 xff0c 类似于Apple的NSM