cocos基础教程(4)数据结构介绍之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(0);
//这里我们 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(1);

//用一个容量初始化一个 vector
Vector<Sprite*>  vec1(5);
//在一个确定的位置插入一个确定的对象
vec1.insert(0, 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 = 1
Cocos2d: sprite tag = 0
Cocos2d: pVec0 is equal to pVec2
Cocos2d: pVec1->capacity()==2; pVec1->size()==2
Cocos2d: The index of sp0 in pVec2 is 0
Cocos2d: The size of pVec1 is 0

最佳实践

  • 偏向于使用基于栈构建的 cocos2d::Vector<T> 而不使用基于堆构建的 cocos2d::Vector<T>。
  • 当将 cocos2d::Vector<T> 作为参数进行传递的时候,将它声明为一个常引用,如 const cocos2d::Vector<T>&。
  • 当从一个函数中返回一个 cocos2d::Vector<T> 时,简单地返回值对象。编译器将使用移动语义优化这种情况。
  • 不要试图在 cocos2d::Vector<T> 中保存除 cocos2d::Object 子类对象指针以外的其他任意数据类型对象。
时间: 2024-10-13 23:24:47

cocos基础教程(4)数据结构介绍之cocos2d::Vector的相关文章

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

1.概述 cocos2d::Valie 是一个包含了很多原生类型(int,float,double,bool,unsigned char,char* 和 std::string)外加 std::vector<Value>, std::unordered_map<std::string,Value> 和 std::unordered_map<int,Value> 的类. 你可以把所有上面的提及的原生类型放入 cocos2d::Value 对象中,然后将它们转化为对应的原生

cocos基础教程(4)数据结构介绍之cocos2d::Map&lt;K,V&gt;

1.概述 cocos2d::Map<K,V> 是一个内部使用了 std::unordered_map的关联容器模版. std::unordered_map 是一个存储了由key-value键值对组合成构成的关联性容器,允许基于键对单个元素进行快速检索. 2.模版参数 K - key value的类型. map中元素都由它的 key值作为唯一标识. V - mapped value的类型. T 必须是一个指向 cocos2d::Object 子类对象的指针. 3.内存管理 如果你在栈上声明了一个

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

下面主要介绍cocos2d-x环境的设置以及android的环境搭建 1.下载cocos2d-x 3.0正式版      http://www.cocos2d-x.org/download 2.下载android的sdk以及ndk     http://developer.android.com/sdk/index.html 3.下载ant     http://ant.apache.org (注:cocos2d-x的环境变量配置需要用到ant,主要是android需要使用到它) 4.下载pyt

Numpy基础教程之概念介绍

https://blog.csdn.net/chaipp0607/article/details/74566340 Numpy是应用Python进行科学计算时的基础模块.它是一个提供多维数组对象的Python库,除此之外,还包含了多种衍生的对象(比如掩码式数组(masked arrays)或矩阵)以及一系列的为快速计算数组而生的例程,包括数学运算,逻辑运算,形状操作,排序,选择,I/O,离散傅里叶变换,基本线性代数,基本统计运算,随机模拟等等. Numpy库中最核心的部分是ndarray 对象.

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

Cocos2d通过调用CCTextureCache或者CCSpriteFrameCache来缓存精灵的纹理. 当这个精灵调用CCTextureCache 或 CCSpriteFrameCache的方法的时候,cocos2dx将使用纹理缓存来创建一个CCSprite.所以你可以预先将纹理加载到缓存中,这样你在场景中使用的时候就非常方便了.怎么样加载这些纹理就看你自己的想法.例如,你可以选择异步加载方式,这样你就可以为loading场景增加一个进度条. 当你创建一个精灵,你一般会使用CCSprite

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

使用音效引擎 我们可以使用Cocos2d-x自带的CocosDension库来使用声音引擎.CocosDesion实现了简单易用的SimpleAudioEngine类,为了使用它,我们只需引入他的头文件即可: #include "SimpleAudioEngine.h" 支持平台与格式 CocosDesion支持的音乐格式如下: 平台 支持的常见文件格式 备注 Android mp3, mid, oggg, wav 可以播放android.media.MediaPlayer所支持的所有

cocos基础教程(8)粒子效果

简介 粒子系统是指计算机图形学中模拟特定现象的技术,它在模仿自然现象.物理现象及空间扭曲上具备得天独厚的优势,为我们实现一些真实自然而又带有随机性的特效(如爆炸.烟花.水流)提供了方便. 粒子属性 一个强大的粒子系统它必然具备了多种多样的属性,这样才能配置出多样的粒子.下面就来看看粒子系统的主要属性吧. 主要属性: _duration 发射器生存时间,即它可以发射粒子的时间,注意这个时间和粒子生存时间不同.单位秒,-1表示永远:粒子发射结束后可点击工具栏的播放按钮再次发射 _emissionRa

cocos基础教程(12)点击交互的三种处理

1.概述 游戏也好,程序也好,只有能与用户交互才有意义.手机上的交互大致可以分为两部分:点击和输入.其中点击更为重要,几乎是游戏中全部的交互.在Cocos2d-x 3.0中,更改了dispatch机制.同时加入了两种新的交互形式:listener 和touchEvent回调.加上先前版本中的点击函数回调,与重写layer层的touch消息响应,构成了一个相对完整的交互模式. 2.三种点击 1.函数回调 函数回调是最简单的响应形式,一直以来被用于MenuItem中的点击处理.在新版本中,此处发生了

cocos基础教程(11)事件分发机制

cocos3.0的事件分发机制: 创建一个事件监听器-用来实现各种触发后的逻辑. 事件监听器添加到事件分发器_eventDispatcher,所有事件监听器有这个分发器统一管理. 事件监听器有以下几种: 触摸事件 (EventListenerTouch) 键盘响应事件 (EventListenerKeyboard) 鼠标响应事件 (EventListenerMouse) 自定义事件 (EventListenerCustom) 加速记录事件 (EventListenerAcceleration)