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的更多相关文章

  1. cocos基础教程(5)数据结构介绍之cocos2d::Value

    1.概述 cocos2d::Valie 是一个包含了很多原生类型(int,float,double,bool,unsigned char,char* 和 std::string)外加 std::vec ...

  2. cocos基础教程(5)数据结构介绍之cocos2d::Map<K,V>

    1.概述 cocos2d::Map<K,V> 是一个内部使用了 std::unordered_map的关联容器模版. std::unordered_map 是一个存储了由key-value ...

  3. cocos基础教程(3)cocos3.x版本目录结构介绍

    简介 cocos2d-x-3.x版本进行了很多优化,比如:将TTF字体用Atlas缓存,节点重排序官方声称提升了10倍速度,查找.移除节点方面也提高了10%,拆分渲染层到独立的线程运行: 另外,coc ...

  4. cocos基础教程(4)基础概念介绍

    在Cocos2d-x-3.x引擎中,采用节点树形结构来管理游戏对象,一个游戏可以划分为不同的场景,一个场景又可以分为不同的层,一个层又可以拥有任意个可见的游戏节点(即对象,游戏中基本上所有的类都派生于 ...

  5. cocos基础教程(1)Mac环境下搭建

    下面主要介绍cocos2d-x环境的设置以及android的环境搭建 1.下载cocos2d-x 3.0正式版      http://www.cocos2d-x.org/download 2.下载a ...

  6. cocos基础教程(9)声音和音效

    使用音效引擎 我们可以使用Cocos2d-x自带的CocosDension库来使用声音引擎.CocosDesion实现了简单易用的SimpleAudioEngine类,为了使用它,我们只需引入他的头文 ...

  7. cocos基础教程(10)纹理缓存技术

    Cocos2d通过调用CCTextureCache或者CCSpriteFrameCache来缓存精灵的纹理. 当这个精灵调用CCTextureCache 或 CCSpriteFrameCache的方法 ...

  8. cocos基础教程(6)坐标与锚点讲解

    坐标系详解 Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系.原点为屏幕左下角,x向右,y向上. 世界坐标系(World Coordinate) VS 本地坐标系(Node L ...

  9. cocos基础教程(2)Window环境下搭建(补充)

    一.环境搭建 1.JDK.Eclipse与SDK 我用的JDK是1.7 Eclipse用的是Luna版的 这些之前都已经设好了,相关下载自己网上找吧 2. 下载最新的Cocos2d-x,我下的是3.5 ...

随机推荐

  1. 编写高质量代码--改善python程序的建议(八)

    原文发表在我的博客主页,转载请注明出处! 建议四十一:一般情况下使用ElementTree解析XML python中解析XML文件最广为人知的两个模块是xml.dom.minidom和xml.sax, ...

  2. Android Studio配置Git及Git文件状态说明

    Android Studio配置Git还是比较简单的,麻烦的是可能中间出现各种问题.如果你想了解或感兴趣,请往下看. 首先你得下载Git客户端,网址:http://git-scm.com/downlo ...

  3. Java学习笔记(六)——google java编程风格指南(下)

    [前面的话] 年后开始正式上班,计划着想做很多事情,但是总会有这样那样的打扰,不知道是自己要求太高还是自我的奋斗意识不够?接下来好好加油.好好学学技术,好好学习英语,好好学习做点自己喜欢的事情,趁着自 ...

  4. iOS UI基础-17.0 UILable之NSMutableAttributedString

    在iOS开发中,常常会有一段文字显示不同的颜色和字体,或者给某几个文字加删除线或下划线的需求.之前在网上找了一些资料,有的是重绘UILabel的textLayer,有的是用html5实现的,都比较麻烦 ...

  5. ASP.NET MVC实现POST方式的Redirect

    我们知道,在ASP.NET MVC中,要从一个Action跳转到另一个Action,通常是用一系列以“Redirect”开头的方法 Redirect RedirectToAction Redirect ...

  6. 在Windows和UNIX下利用PHP和LDAP进行身份验证

    我现在的老板曾要求我为企业内部的Web服务提供一种标准的身份验证方法.我遇到的一个主要问题就是我们公司主要使用了两种平台:UNIX和.所以,我的第一个想法并不很成功:它要求每个员工都使用UNIX或者L ...

  7. Hibernate-入门教程

    首先了解hibernate的目录结构 . +lib antlr.jar cglib-full.jar asm.jar asm-attrs.jars commons-collections.jar co ...

  8. 处理Json数据中的日期类型.如/Date(1415169703000)/格式

    在asp.net mvc后台返回到视图中的json数据中想对数据进行操作,发现日期类型无法直接进行操作,需要转换为指定格式才行.在网上也搜了下方法也很多,觉得有点麻烦,最终使用正则搞定了,分享下: v ...

  9. Yii2登陆添加验证码

    models中 LoginForm.php public $verifyCode; public function rules() { return [ …… ['verifyCode', 'capt ...

  10. Fedora和Ubuntu下安装OpenGL开发环境配置

    Fedora下OpenGl开发环境配置 开发OpenGL工程需要3个库文件和对应的头文件: libglut.so,libGLU.so,libGL.so, gl.h ,glu.h, glut.h 这些库 ...