您的位置:首页 > 理论基础 > 数据结构算法

cocos2d-x-3.1 数据结构之Vector (coco2d-x 学习笔记六)

2014-06-15 15:55 465 查看


介绍

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());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: