• 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());



  • 相关阅读:
    几种常见的软件体系结构及特点分析
    mvc模式
    代理模式 补充
    软件架构体系风格
    大道至简之编程的精义读后感-Java伪代码
    MVC架构模式实例
    浅谈模型-视图-控制器模式
    《大型网站技术架构:核心原理与案例分析》读后感
    质量属性分析
    构架漫谈读后感之软件架构师的工作
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7099459.html
Copyright © 2020-2023  润新知