cocos2d-x-3.1 数据结构之Vector (coco2d-x 学习笔记六)
介绍
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());
cocos2d-x-3.1 数据结构之Vector (coco2d-x 学习笔记六)的更多相关文章
- 数据结构与算法C++描述学习笔记1、辗转相除——欧几里得算法
前面学了一个星期的C++,以前阅读C++代码有些困难,现在好一些了.做了一些NOI的题目,这也是一个长期的目标中的一环.做到动态规划的相关题目时发现很多问题思考不通透,所以开始系统学习.学习的第一本是 ...
- 数据结构与算法之美学习笔记:B+树(第48讲)
一.解决问题的前提是定义清楚问题 通过对一些模糊需求进行假设,来限定要解决问题的范围 根据某个值查找数据,比如 select * from use where id=1234: 根据区间值来查询某些数 ...
- 数据结构(java版)学习笔记(序章)
程序=数据结构+算法 序章做一个简单的思维导图,方便理解数据结构这门课的大纲,接下来我们将是按照线性表,栈,队列,串,树和图的顺序依次往下学.
- 数据结构(java版)学习笔记(一)——线性表
一.线性表的定义 线性表是n(n>=0)个具有相同特性的数据元素的有限序列. 线性表是最简单.最常用的一种数据结构 线性表属于线性结构的一种 如果一个数据元素序列满足: (1)除第一个和最后一个 ...
- Java基础学习笔记(六) - 数据结构和集合
一.认识数据结构 1.数据结构有什么用? 合理的使用数据结构,可以更方便的查找存储数据. 2.常见的数据结构 数据存储常用结构有:栈.队列.数组.链表和红黑树. 栈:堆栈(stack),它是运算受限的 ...
- 【数据结构与算法Python版学习笔记】引言
学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...
- 【数据结构与算法Python版学习笔记】目录索引
引言 算法分析 基本数据结构 概览 栈 stack 队列 Queue 双端队列 Deque 列表 List,链表实现 递归(Recursion) 定义及应用:分形树.谢尔宾斯基三角.汉诺塔.迷宫 优化 ...
- 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链
散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...
- 【数据结构与算法Python版学习笔记】基本数据结构——列表 List,链表实现
无序表链表 定义 一种数据项按照相对位置存放的数据集 抽象数据类型无序列表 UnorderedList 方法 list() 创建一个新的空列表.它不需要参数,而返回一个空列表. add(item) 将 ...
随机推荐
- JavaScript(十一)Dom
Dom(Document object module) 1.获取dom对象的方法 正常用的方法 推荐 getElementById()//通过id选择唯一的dom getElementsByClass ...
- Unity笔记(3)自学第三天
学习记录: 脚本使用:
- 通过机智云APP来学习安卓
效果非常之好,安卓6.0之后就进行了动态授权.按照网上的视频一步一步调试的非常成功,非常舒服.
- 解决 HTTP Status 500 - Unable to show problem report: freemarker.core.InvalidReferenceException:
HTTP Status 500 - Unable to show problem report: freemarker.core.InvalidReferenceException: The foll ...
- ubuntu16.04安装teamviewer12
安装teamviewer下载地址:http://www.teamviewer.com/en/download/linux/ 下载的是:teamviewer_12.0.76279_i386.deb ...
- Stack frame
http://en.citizendium.org/wiki/Stack_frame In computer science, a stack frame is a memory management ...
- 梦想CAD控件安卓交互绘图
在cad使用过程中,动态绘制的使用会使我们绘图速度大大加快.在此演示中,我们绘制了直线.多段线.点.样条线.圆.圆弧.椭圆.椭圆弧等实体. 用户可以在CAD控件视区任意位置绘制直线. 主要用到函数说明 ...
- JavaScript 实现页面中录音功能
页面中实现录音需要使用浏览器提供的 MediaRecorder API,所以前提是需要浏览器支持 MediaStream Recording 相关的功能. 以下代码默认工作在 Chrome 环境中. ...
- Linux系统安装,组成及开关机
Linux系统安装,组成及开关机 系统安装 swap分区用于实现虚拟内存,文件系统类型是swap. /分区用于存放包括系统程序和用户数据在内的所有数据,文件系统类型是ext4. 系统组成 Linux内 ...
- C++ std::map的安全遍历并删除元素的方法
首先我们讲遍历std::map, 大部分人都能写出第一种遍历的方法,但这种遍历删除的方式并不太安全. 第一种 for循环变量: #include<map> #include<stri ...