cocos基础教程(5)数据结构介绍之cocos2d::Vector
cocos2d::Vector
cocos2d::Vector<T>
是一个封装好的能动态增长顺序访问的容器。cocos2d::Vector<T>
中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容器std::vector
。
T - 元素类型
- T的类型必须是继承自
cocos2d::Object
类型的指针。因为已经将Cocos2d-x的内存管理模型集成到了cocos2d::Vector<T>
中,所以类型参数不能是其他的类型包括基本类型。
注意:使用现代的c++,本地存储对象比堆存储对象好。所以请不要用new操作来申请cocos2d::Vector<T>
的堆对象,请使用栈对象。
警告:cocos2d::Vector<T>
并不是cocos2d::Object
的子类,所以不要像使用其他cocos2d类一样来用retain/release和引用计数内存管理。
用法:pushBack()操作将会保留传递过来的参数,而popBack()则会释放掉容器中最后的一个元素。cocos2d::Vector<T>
并没有重载[]操作,所以不能直接用下标[i]来获取第i位元素。cocos2d::Vector<T>
提供了不同类型的迭代器,我们可以使用大量标准泛型算法和for_each循环。如果你有足够的理由在堆上动态分配 cocos2d::Vector<T> 的话,请使用智能指针替换原始指针,比如 Shared_ptr,unique_ptr。
这里提供一个简单的示例:
//使用默认大小创建一个 Vector<Sprite*>,然后往其中加入一个精灵
auto sp0 = Sprite::create();
sp0->setTag();
//这里我们 demo 使用了 shared_ptr,在你的代码中,请使用栈对象替代
std::shared_ptr<Vector<Sprite*>> vec0 = std::make_shared<Vector<Sprite*>>(); //default constructor
vec0->pushBack(sp0); //使用capacity为5来创建一个 Vector<Object*>,然后往其中加入一个精灵
auto sp1 = Sprite::create();
sp1->setTag(); //用一个容量初始化一个 vector
Vector<Sprite*> vec1();
//在一个确定的位置插入一个确定的对象
vec1.insert(, sp1); //我们也可以加入一整个 vector
vec1.pushBack(*vec0); for(auto sp : vec1)
{
log("sprite tag = %d", sp->getTag());
} Vector<Sprite*> vec2(*vec0);
if (vec0->equals(vec2)) { //如果两个 vector 相同的话返回真
log("pVec0 is equal to pVec2");
}
if (!vec1.empty()) { //判断 vector 是否为空
//获取 vector 的 capacity 和 size,要注意的是 capacity 并不一定等于 size
if (vec1.capacity() == vec1.size()) {
log("pVec1->capacity()==pVec1->size()");
}else{
vec1.shrinkToFit(); //收缩 vector 以便内存对应上元素的数量
log("pVec1->capacity()==%zd; pVec1->size()==%zd",vec1.capacity(),vec1.size());
}
//pVec1->swap(0, 1); //通过索引交换 vector 中的两个元素
vec1.swap(vec1.front(), vec1.back()); //通过值交换 vector 中的两个元素
if (vec2.contains(sp0)) { //返回一个布尔值,用于指示该对象是否存在于 vector 中
log("The index of sp0 in pVec2 is %zd",vec2.getIndex(sp0));
}
//从 vector 中移除元素
vec1.erase(vec1.find(sp0));
//pVec1->erase(1);
//pVec1->eraseObject(sp0,true);
//pVec1->popBack(); vec1.clear(); //移除所有元素
log("The size of pVec1 is %zd",vec1.size());
}
输出结果
Cocos2d: sprite tag =
Cocos2d: sprite tag =
Cocos2d: pVec0 is equal to pVec2
Cocos2d: pVec1->capacity()==; pVec1->size()==
Cocos2d: The index of sp0 in pVec2 is
Cocos2d: The size of pVec1 is
最佳实践
- 偏向于使用基于栈构建的 cocos2d::Vector<T> 而不使用基于堆构建的 cocos2d::Vector<T>。
- 当将 cocos2d::Vector<T> 作为参数进行传递的时候,将它声明为一个常引用,如 const cocos2d::Vector<T>&。
- 当从一个函数中返回一个 cocos2d::Vector<T> 时,简单地返回值对象。编译器将使用移动语义优化这种情况。
- 不要试图在 cocos2d::Vector<T> 中保存除 cocos2d::Object 子类对象指针以外的其他任意数据类型对象。
cocos基础教程(5)数据结构介绍之cocos2d::Vector的更多相关文章
- cocos基础教程(5)数据结构介绍之cocos2d::Value
1.概述 cocos2d::Valie 是一个包含了很多原生类型(int,float,double,bool,unsigned char,char* 和 std::string)外加 std::vec ...
- cocos基础教程(5)数据结构介绍之cocos2d::Map<K,V>
1.概述 cocos2d::Map<K,V> 是一个内部使用了 std::unordered_map的关联容器模版. std::unordered_map 是一个存储了由key-value ...
- cocos基础教程(3)cocos3.x版本目录结构介绍
简介 cocos2d-x-3.x版本进行了很多优化,比如:将TTF字体用Atlas缓存,节点重排序官方声称提升了10倍速度,查找.移除节点方面也提高了10%,拆分渲染层到独立的线程运行: 另外,coc ...
- cocos基础教程(4)基础概念介绍
在Cocos2d-x-3.x引擎中,采用节点树形结构来管理游戏对象,一个游戏可以划分为不同的场景,一个场景又可以分为不同的层,一个层又可以拥有任意个可见的游戏节点(即对象,游戏中基本上所有的类都派生于 ...
- cocos基础教程(1)Mac环境下搭建
下面主要介绍cocos2d-x环境的设置以及android的环境搭建 1.下载cocos2d-x 3.0正式版 http://www.cocos2d-x.org/download 2.下载a ...
- cocos基础教程(9)声音和音效
使用音效引擎 我们可以使用Cocos2d-x自带的CocosDension库来使用声音引擎.CocosDesion实现了简单易用的SimpleAudioEngine类,为了使用它,我们只需引入他的头文 ...
- cocos基础教程(10)纹理缓存技术
Cocos2d通过调用CCTextureCache或者CCSpriteFrameCache来缓存精灵的纹理. 当这个精灵调用CCTextureCache 或 CCSpriteFrameCache的方法 ...
- cocos基础教程(6)坐标与锚点讲解
坐标系详解 Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系.原点为屏幕左下角,x向右,y向上. 世界坐标系(World Coordinate) VS 本地坐标系(Node L ...
- cocos基础教程(2)Window环境下搭建(补充)
一.环境搭建 1.JDK.Eclipse与SDK 我用的JDK是1.7 Eclipse用的是Luna版的 这些之前都已经设好了,相关下载自己网上找吧 2. 下载最新的Cocos2d-x,我下的是3.5 ...
随机推荐
- java并发:线程同步机制之Lock
一.初识Lock Lock是一个接口,提供了无条件的.可轮询的.定时的.可中断的锁获取操作,所有加锁和解锁的方法都是显式的,其包路径是:java.util.concurrent.locks.Lock, ...
- ASCII、Unicode、GBK和UTF-8字符编码的区别联系(转载)
ASCII.Unicode.GBK和UTF-8字符编码的区别联系 转载自:http://dengo.org/archives/901 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同 ...
- ASP.NET MVC系列 框架搭建(一)之仓储层的搭建
大神勿喷,小神默默学. 会了就是不值一提的东西,不会就是绝对的高大上. 最后上传源码.希望能给读者带来一些新的认识及知识. 还没上过头条..各位大神,请点支持一下小弟. 陆续更新.更新到你会为止!! ...
- FileStream大文件复制
FileStream缓冲读取和写入可以提高性能.FileStream读取文件的时候,是先讲流放入内存,经Flash()方法后将内存中(缓冲中)的数据写入文件.如果文件非常大,势必消耗性能.特封装在Fi ...
- xml基本操作
在实际项目中遇到一些关于xml操作的问题,被逼到无路可退的时候终于决定好好研究xml一番.xml是一种可扩展标记语言,可跨平台进行传输,因此xml被广泛的使用在很多地方. 本文由浅入深,首先就xml的 ...
- JavaBean ,Enterprise Bean(EJB), 三种Bean, 以及POJO
Bean简单的理解,可以理解为组件,一组通用方法的组合: JavaBean就可以称为Java组件,是所有组件的统称,EJB称为企业级 Java组件: 三种Bean: 1). session beans ...
- 使用Ps制作透明ico
准备好图片 打开Ps新建透明图片->抠取图片->复制粘贴 保存为gif格式->使用ico在线转换即可
- iOS开发小技巧--设置按钮圆角
方法一:代码设置 方法二:通过图形化界面
- hdu 1166 敌兵布阵--BIT
BIT模版题,学完直接刷毫无压力,水的不要不要的 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- Ubuntu 及衍生版本用户如何安装 SmartGit/HG
http://www.linuxidc.com/Linux/2014-06/102621.htm Ubuntu 及衍生版本用户如何安装 SmartGit/HG 6.0.0 [日期:2014-06-03 ...