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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值