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) 将 ...
随机推荐
- IDEA 导入maven项目,显示:nothing to show
问题描述: IDEA 导入maven项目,import project,默认下一步,直到Select Maven projects to import界面无选项,提示:nothing to show ...
- Android开发笔记(4)——MainActivity.java文件修改&布局嵌套
笔记链接:http://www.cnblogs.com/igoslly/p/6805020.html 笔记以开发名为CoffeeOrder的app活动为线索,介绍app如何从功能设计→ ...
- Hive扩展功能(九)--Hive的行级更新操作(Update)
软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这三部机, 每部主机的用户名都为centos ...
- Linux服务器文件权限被改
阿里云买的ubuntu服务器遭受了不明攻击,导致站点访问不了,折腾了很久,才发现是文件的权限被修改了.然后就是一点点的修改,很是麻烦.服务器的安全要重视呢! 1.修改权限 chmod 755 * -R ...
- Java软件开发中迭代的含义
软件开发中,各个开发阶段不是顺序执行的,而各个阶段都进行迭代并行执行的,然后在进入下一个阶段的开发. 这样对于开发中的需求变化,及人员变动都能得到更好的适应. 软件开发过程汇总迭代模型如下图所示:
- java读取03、07版EXCEL
03版excel,需要用到jxl.jar这个jar包 package test.poi; import java.io.File; import java.io.IOException; import ...
- Discuz!伪静态原理分析
伪静态在seo火热的时代,是每个站长都比较关注的问题,discuz!论坛如何伪静态,为什么伪静态失效了,为什么列表页无法实现伪静态,为什么有些页面不是伪静态呢?下面dz官方nxy105从两个角度入手为 ...
- Go:变量、常量、枚举
一.变量 package main import "fmt" func variableZeroValue() { // 变量声明 var a int var b string f ...
- exception对象的使用及常用方法
exception对象的使用及常用方法 制作人:全心全意 exception对象用来处理JSP文件执行时发生的所有错误和异常,只有在page指令中设置为isErrorPage属性值为true的页面中才 ...
- vue-cli 3.x 配置多环境
思路:新建一个 process.env 变量. 把 webpack 配置放到 vue.config.js 里面. 如果根目录下没有该文件,新建.配置参考:https://cli.vuejs.org/z ...