cocos2d-x-3.1 数据结构之Vector (coco2d-x 学习笔记六)
2023-09-11 14:14:42 时间
介绍
cocos2d::Vector<T>
是一个封装好的能动态增长顺序訪问的容器。
cocos2d::Vector<T>
中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容器std::vector
。
在cocos2d-x v3.0 beta之前。使用的是另外一个顺序訪问容器cocos2d::CCArray
。只是它将会被废弃。
设计者们将cocos2d::Vector<T>
设计为cocos2d::CCArray
的替代品,所以建议优先考虑使用cocos2d::Vector<T>
。 cocos2d::Vector<T>
的一些操作的时间复杂度例如以下:
- 随机訪问。O(1)
- 将元素插入到尾部或者删除尾部的元素。O(1)
- 随机插入或删除, O(n)
模版參数
T - 元素类型
- T的类型必须是继承自
cocos2d::Object
类型的指针。由于已经将cocos2d-x的内存管理模型集成到了cocos2d::Vector<T>
中。所以类型參数不能是其它的类型包含基本类型。
内存管理
_data
的内存管理是由编译器自己主动处理的,假设声明了一个cocos2d::Vector<T>
类型。就不必费心去释放内存。
注意:使用现代的c++,本地存储对象比堆存储对象好。
所以请不要用new操作来申请cocos2d::Vector<T>
的堆对象。请使用栈对象。
假设真心想动态分配堆cocos2d::Vector<T>
,请将原始指针用智能指针来覆盖。 警告:cocos2d::Vector<T>
并非cocos2d::Object
的子类,所以不要像使用其它cocos2d类一样来用retain/release和引用计数内存管理。
基本使用方法
Vector<Sprite*>mVector; Sprite* sp1 = Sprite::create(); sp1->setTag(1); Sprite* sp2 = Sprite::create(); sp2->setTag(2); Sprite* sp3 = Sprite::create(); sp3->setTag(3); Sprite* sp4 = Sprite::create(); sp4->setTag(4); mVector.pushBack(sp1); //pushBack操作将保留传递过来的參数 mVector.pushBack(sp2); mVector.pushBack(sp3); mVector.pushBack(sp4); for (Sprite* obj : mVector) { log("obj=%d", obj->getTag()); } log("===================== pushBack切割线 ======================"); mVector.insert(0, sp2); //insert插入数据下标从0開始 for (Sprite* obj : mVector) { log("obj=%d", obj->getTag()); } log("===================== insert切割线 ======================"); mVector.popBack(); //移除最后一个元素 for (Sprite* obj : mVector) { log("obj=%d", obj->getTag()); }
输出日志为:
obj=1 obj=2 obj=3 obj=4 ===================== pushBack切割线 ====================== obj=2 obj=1 obj=2 obj=3 obj=4 ===================== insert切割线 ====================== obj=2 obj=1 obj=2 obj=3
算法使用
Sprite* sp0 = Sprite::create(); Vector<Sprite*>::iterator it = mVector.find(sp0); //std::find算法使用 if (it != mVector.end()){ log("find!"); } else{ log("not find!"); } mVector.reverse(); //顾名思义,逆转容器里面的元素 mVector.swap(0, 1); //交换其位置 for (Sprite* obj : mVector) { log("obj=%d", obj->getTag()); } log("size=%d", mVector.size()); mVector.clear(); log("size=%d", mVector.size());
相关文章
- face-api.js 学习笔记
- WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]
- 【学习笔记09】:JavaScript单引号、双引号和反引号的区别
- 机器学习笔记之谱聚类(一)k-Means聚类算法介绍
- JavaSE 千寻简学习笔记
- 堆栈 学习笔记
- PHP全栈学习笔记5
- vue3学习笔记(兄弟组件传参)
- node.js 学习笔记一
- CSS学习笔记
- Android学习笔记进阶18之画图并保存图片到本地
- opencv学习笔记——Scalar数据结构的理解
- SQLite学习笔记之50核心函数您认识并掌握几个?
- CSS+CSS3 笔记大总结,快来一起复习吧,有你不会的吗
- vuex状态管理之学习笔记
- JSP学习笔记(三)EL表达式 JSTL标签
- JSP-Spring4学习笔记(四)装饰模式、静态和动态代理
- Oracle数据库学习笔记(一)
- 【C++快速上手】十一、assert学习笔记
- Xilinx ISERDESE2应用笔记及仿真实操
- flash调试笔记
- 高效能人士的七个习惯笔记
- Linux学习笔记(7)CRT实现windows与linux的文件上传下载
- 关于类和异常的笔记
- 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(三)Activity Indicators视图 学习笔记
- Linux下汇编语言学习笔记11 ---