最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

Cocos2d-x3.0中容器介绍(cocos2d::Vector)

来源:懂视网 责编:小采 时间:2020-11-09 16:05:40
文档

Cocos2d-x3.0中容器介绍(cocos2d::Vector)

Cocos2d-x3.0中容器介绍(cocos2d::Vector):v3.0加入 定义在COCOS2DX_ROOT/cocos/base的CCVector.h头文件中。 templateclass CC_DLL Vector; cocos2d::Vector是一个封装好的能动态增长顺序访问的容器。 cocos2d::Vector中的元素是按序存取的,它的低层实现数据结构是标准模版库
推荐度:
导读Cocos2d-x3.0中容器介绍(cocos2d::Vector):v3.0加入 定义在COCOS2DX_ROOT/cocos/base的CCVector.h头文件中。 templateclass CC_DLL Vector; cocos2d::Vector是一个封装好的能动态增长顺序访问的容器。 cocos2d::Vector中的元素是按序存取的,它的低层实现数据结构是标准模版库

v3.0加入 定义在”COCOS2DX_ROOT/cocos/base”的”CCVector.h”头文件中。 templateclass CC_DLL Vector; cocos2d::Vector是一个封装好的能动态增长顺序访问的容器。 cocos2d::Vector中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容

  • v3.0加入
  • 定义在”COCOS2DX_ROOT/cocos/base”的”CCVector.h”头文件中。


    templateclass CC_DLL Vector;


    cocos2d::Vector是一个封装好的能动态增长顺序访问的容器。

    cocos2d::Vector中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容器std::vector。

    在cocos2d-x v3.0 beta之前,使用的是另外一个顺序访问容器cocos2d::CCArray,不过它将会被废弃。

    设计者们将cocos2d::Vector设计为cocos2d::CCArray的替代品,所以建议优先考虑使用cocos2d::Vector。

    cocos2d::Vector的一些操作的时间复杂度如下:

  • 随机访问,O(1)
  • 将元素插入到尾部或者删除尾部的元素,O(1)
  • 随机插入或删除, O(n)
  • 模版参数

    T – 元素类型

  • T的类型必须是继承自cocos2d::Ref类型的指针。因为已经将cocos2d-x的内存管理模型集成到了cocos2d::Vector中,所以类型参数不能是其他的类型包括基本类型。
  • 内存管理

    cocos2d::Vector类只包含一个成员数据:

    std::vector _data;

    _data的内存管理是由编译器自动处理的,如果声明了一个cocos2d::Vector类型,就不必费心去释放内存。

    注意:使用现代的c++,本地存储对象比堆存储对象好。所以请不要用new操作来申请cocos2d::Vector的堆对象,请使用栈对象。

    如果真心想动态分配堆cocos2d::Vector,请将原始指针用智能指针来覆盖。

    警告:cocos2d::Vector并不是cocos2d::Ref的子类,所以不要像使用其他cocos2d类一样来用retain/release和引用计数内存管理。

    基本用法

    作者们用std::vector的基本操作加上cocos2d-x的内存管理规则来覆盖该模版原先的普通操作。

    所以pushBack()操作将会保留传递过来的参数,而popBack()则会释放掉容器中最后的一个元素。

    当你使用这些操作的时候,你需要特别注意这些受托管的对象,对于新手来说,这往往是陷阱。

    警告:cocos2d::Vector并没有重载[]操作,所以不能直接用下标[i]来获取第i位元素。

    cocos2d::Vector提供了不同类型的迭代器,所以我们可以受益于c++的标准函数库,我们可以使用大量标准泛型算法和for_each循环。

    除了std::vector容器的操作之外,开发者们还加入许多标准算法诸如:std::find, std::reverse和std::swap,这些算法可以简化很多通用的操作。

    要了解更多的api用例,可以参考cocos2d-x 3.0的源码和压缩包里附带的例子。

    下面是一些简单的例子:

    //create Vector with default size and add a sprite into itauto sp0 =Sprite::create();
    sp0->setTag(0);//here we use shared_ptr just as a demo. in your code, please use stack object instead
    std::shared_ptr> vec0 = std::make_shared>();//default constructor
    vec0->pushBack(sp0);//create a Vector with a capacity of 5 and add a sprite into itauto sp1 =Sprite::create();
    sp1->setTag(1);//initialize a vector with a capacityVector vec1(5);//insert a certain object at a certain index
    vec1.insert(0, sp1);//we can also add a whole vector
    vec1.pushBack(*vec0);for(auto sp : vec1){
     log("sprite tag = %d", sp->getTag());}Vector vec2(*vec0);if(vec0->equals(vec2)){//returns true if the two vectors are equal
     log("pVec0 is equal to pVec2");}if(!vec1.empty()){//whether the Vector is empty//get the capacity and size of the Vector, noted that the capacity is not necessarily equal to the vector size.if(vec1.capacity()== vec1.size()){
     log("pVec1->capacity()==pVec1->size()");}else{
     vec1.shrinkToFit();//shrinks the vector so the memory footprint corresponds with the number of items
     log("pVec1->capacity()==%zd; pVec1->size()==%zd",vec1.capacity(),vec1.size());}//pVec1->swap(0, 1); //swap two elements in Vector by their index
     vec1.swap(vec1.front(), vec1.back());//swap two elements in Vector by their valueif(vec2.contains(sp0)){//returns a Boolean value that indicates whether object is present in vector
     log("The index of sp0 in pVec2 is %zd",vec2.getIndex(sp0));}//remove the element from the Vector
     vec1.erase(vec1.find(sp0));//pVec1->erase(1);//pVec1->eraseObject(sp0,true);//pVec1->popBack();

    vec1.clear();//remove all elements log("The size of pVec1 is %zd",vec1.size());}

    输出:

    Cocos2d: sprite tag =1Cocos2d: sprite tag =0Cocos2d: pVec0 is equal to pVec2
    Cocos2d: pVec1->capacity()==2; pVec1->size()==2Cocos2d:The index of sp0 in pVec2 is0Cocos2d:The size of pVec1 is0

    推荐做法

  • 考虑基于栈的cocos2d::Vector优先用于基于堆的
  • 当将cocos2d::Vector作为参数传递时,将它声明成常量引用:const cocos2d::Vector&
  • 返回值是cocos2d::Vector时,直接返回值,这种情况下编译器会优化成移动操作。
  • 不要用任何没有继承cocos2d::Ref的类型作为cocos2d::Vector的数据类型。
  • 声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文档

    Cocos2d-x3.0中容器介绍(cocos2d::Vector)

    Cocos2d-x3.0中容器介绍(cocos2d::Vector):v3.0加入 定义在COCOS2DX_ROOT/cocos/base的CCVector.h头文件中。 templateclass CC_DLL Vector; cocos2d::Vector是一个封装好的能动态增长顺序访问的容器。 cocos2d::Vector中的元素是按序存取的,它的低层实现数据结构是标准模版库
    推荐度:
    标签: 介绍 3.0 容器
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top