Cocos2d-x 3.0数据结构——cocos2d::Vector

Cocos2d-x 3.0数据结构——cocos2d::Vector,第1张

概述cocos2d::Vector<T>是一个封装好的能动态增长顺序访问的容器。 cocos2d::Vector<T>中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容器std::vector。 在Cocos2d-x v3.0 beta之前,使用的是另外一个顺序访问容器cocos2d::CCArray,不过它将会被废弃。 模版参数 T - 元素类型 T的类型必须是继承自cocos2d

cocos2d::Vector<T>是一个封装好的能动态增长顺序访问的容器。 cocos2d::Vector<T>中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容器std::vector。 在Cocos2d-x v3.0 beta之前,使用的是另外一个顺序访问容器cocos2d::CCArray,不过它将会被废弃。

模版参数 T - 元素类型
T的类型必须是继承自cocos2d::Object类型的指针。因为已经将Cocos2d-x的内存管理模型集成到了cocos2d::Vector<T>中,所以类型参数不能是其他的类型包括基本类型。 内存管理 使用现代的c++,本地存储对象比堆存储对象好。所以请不要用new *** 作来申请cocos2d::Vector<T>的堆对象,请使用栈对象。 如果真心想动态分配堆cocos2d::Vector<T>,请将原始指针用智能指针来覆盖。 cocos2d::Vector<T>并不是cocos2d::Object的子类,所以不要像使用其他cocos2d类一样来用retain/release和引用计数内存管理。 基本用法

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

cocos2d::Vector提供了不同类型的迭代器,所以我们可以受益于c++的标准函数库,我们可以使用大量标准泛型算法和for_each循环。 除了std::vector容器的 *** 作之外,开发者们还加入许多标准算法诸如:std::find,std::reverse和std::swap,这些算法可以简化很多通用的 *** 作。 要了解更多的API用例,可以参考Cocos2d-x 3.0beta的源码和压缩包里附带的例子。 下面是一些简单的例子:

//create Vector<Sprite*> 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 insteadstd::shared_ptr<Vector<Sprite*>>  vec0 = std::make_shared<Vector<Sprite*>>();  //default constructorvec0->pushBack(sp0);//create a Vector<Object*> with a capacity of 5 and add a sprite into itauto sp1 = Sprite::create();sp1->setTag(1);//initialize a vector with a capacityVector<Sprite*>  vec1(5);//insert a certain object at a certain indexvec1.insert(0,sp1);//we can also add a whole vectorvec1.pushBack(*vec0);for(auto sp : vec1){    log("sprite tag = %d",sp->getTag());}Vector<Sprite*> 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 value    if (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 = 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>作为参数传递时,将它声明成常量引用:const cocos2d::Vector<T>& 返回值是cocos2d::Vector<T>时,直接返回值,这种情况下编译器会优化成移动 *** 作。 不要用任何没有继承cocos2d::Object的类型作为cocos2d::Vector<T>的数据类型。 总结

以上是内存溢出为你收集整理的Cocos2d-x 3.0数据结构——cocos2d::Vector全部内容,希望文章能够帮你解决Cocos2d-x 3.0数据结构——cocos2d::Vector所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1080835.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存