Cocos2d-x中Vector<T>容器以及实例介绍
Vector<T> 是Cocos2d-x 3.x推出的列表容器,因此它所能容纳的是Ref及子类所创建的对象指针,其中的T是模板,表示能够放入到容器中的类型,在Cocos2d-x 3.x中T表示Ref类。Vector<T>是模仿C++的std::vector<T>模板类而设计的。
在内存管理方面不使用__Array的引用计数,它的内存管理是由编译器自己主动处理的,能够不用考虑内存释放问题。
Vector<T>的性能优于__Array类。Coco2d-x官方将Vector<T>设计为__Array的替代品,推荐使用Vector<T>类。
1、创建Vector对象
创建Vector对象有非常多函数。以下是总结经常使用的函数:
Vector()。
默认的构造函数。
Vector(ssize_t capacity)。创建Vector对象,并设置容量。
Vector(const Vector<T> &other) 。
用一个已存在的Vector对象创建还有一个Vector对象。当中&other是左值引用參数传递。
Vector(Vector<T> &&other) 。用一个已存在的Vector对象创建还有一个Vector对象。当中&&other是右值引用參数传递。
提示 左值与右值?C++中全部的表达式和变量要么是左值。要么是右值。左值的定义就是非暂时变量,能够在多条语句中使用的变量。右值是指暂时的变量,它们仅仅在当前的语句中有效。比如在语句int i = 0;中i为左值。0位右值。
左值与右值还能够出如今函数參数列表中,即左值引用(&)和右值引用(&&),例如以下代码所看到的。
void process_value(int& i) { //& i表示左值引用
std::cout << "左值引用: " << i << std::endl;
}
void process_value(int&& i) { //&& i表示右值引用
std::cout << "右值引用: " << i << std::endl;
}
int main() {
int a = 0;
process_value(a); //调用void process_value(int& i)函数
process_value(1); //调用void process_value(int&& i)函数
}
2、加入元素
向Vector对象中加入元素都必须是Ref对象指针类型,以下是总结经常使用的函数:
void pushBack(T object) 。
加入一个元素,T表示Ref对象指针类型。
void pushBack(const Vector<T> &other)。
把一个Vector对象中全部元素加入到当前Vector对象中。
void insert(ssize_t index, T object) 。
在指定位置插入元素,ssize_t是int类型别名。
3、移除元素
以下是总结经常使用的移除Vector<T>容器中元素的函数:
void popBack()。
移除最后一个元素。
void eraseObject(T object, bool removeAll=false)。
移除某个元素。
iterator erase(iterator position)。指定位置移除对象。參数是迭代器,而返回值是下一个迭代器。
iterator erase(iterator first, iterator last)。指定移除对象范围(first~last)。參数是迭代器,而返回值是下一个迭代器。
iterator erase(ssize_t index)。移除一个指定索引的元素,參数是ssize_t,而返回值是下一个迭代器。
void clear ()。移除全部元素。
4、替换和交换元素
我们还能够通过以下函数对Vector容器中元素替换和交换:
void swap(T object1, T object2)。
交换2个元素。
void swap(ssize_t index1, ssize_t index2)。交换2个指定位置元素。
void replace(ssize_t index, T object)。
用一个对象替代指定位置元素。
5、查找操作
我们有的时候还须要操作Vector中的元素,以下是总结经常使用的查找函数:
iterator find (T object)。查找Vector容器中的对象,返回值迭代器。
T at(ssize_t index)。依据索引位置返回Vector容器中的元素。
T front()。
返回第一个元素。
T back ()。返回最后一个元素。
T getRandomObject()。
返回随机元素。
bool contains(T object)。
返回某个元素是否存在容器中。
ssize_t getIndex (T object)。
返回指定对象的位置。
6、其他操作函数
此外还有非常多操作Vector对象函数,以下是总结经常使用的函数:
ssize_t size ()。返回元素个数。
ssize_t capacity()。
返回Vector的容量。
实例:Vector容器
为了熟悉Vector类的主要函数。以下我们将13.2.2一节的实例通过Vector列表容器实现一下。如图13-3所看到的场景,点击右下角的Gobutton。在场景中加入100个精灵。
以下我们看看代码部分,HelloWorldScene.h代码例如以下:
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" #define MAX_COUNT 100 class HelloWorld : public cocos2d::Layer
{
cocos2d::Vector<cocos2d::Sprite*> list; ①
public:
static cocos2d::Scene* createScene(); virtual bool init(); void menuCloseCallback(cocos2d::Ref* pSender); CREATE_FUNC(HelloWorld);
}; #endif // __HELLOWORLD_SCENE_H__
上述代码与13.2.2一节实例比較。我们将list成员变量类型换成了cocos2d::Vector<cocos2d::Sprite*>,见第①行代码所看到的。注意我们不再须要析构函数声明了,使用Vector比較方便的是内存管理由编译器自己主动处理的系统。
HelloWorldScene.cpp中的主要代码例如以下:
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
} Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin(); auto goItem = MenuItemImage::create(
"go-down.png",
"go-up.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); goItem->setPosition(Vec2(origin.x + visibleSize.width - goItem->getContentSize().width/2 ,
origin.y + goItem->getContentSize().height/2)); auto menu = Menu::create(goItem, NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu, 1); this->list = Vector<Sprite*>(MAX_COUNT); ① for(int i = 0;i < MAX_COUNT; ++i){ ②
Sprite* sprite = Sprite::create("Ball.png");
this->list.pushBack(sprite); ③
} return true;
} void HelloWorld::menuCloseCallback(Ref* pSender)
{
Ref* obj = nullptr;
log("List count = %d",this->list.size());
Size visibleSize = Director::getInstance()->getVisibleSize(); for(const auto& sprite : this->list) ④
{
int x = CCRANDOM_0_1() * visibleSize.width;
int y = CCRANDOM_0_1() * visibleSize.height; sprite->setPosition( Vec2(x, y) );
this->removeChild(sprite);
this->addChild(sprite);
} }
上述代码第①行this->list = Vector<Sprite*>(MAX_COUNT)是创建Vector 类型的list成员变量,并指定Vector容器内存放的是Sprite指针类型。Vector构造函数參数是容器的初始化容量。第②行代码进行for循环创建100个精灵对象。
第③行代码this->list.pushBack(sprite)是将精灵对象加入到list容器对象中。pushBack是Vector通过的加入元素函数,因为在第①行设置list容器的模板为Sprite指针,所以pushBack函数仅仅能放过Sprite和其子类指针类型。
第④行代码for(const auto& sprite : this->list){…}是循环遍历list容器对象,这里使用的循环是C++11规范的新功能range-based for loops,range-based for loops被翻译为“序列for循环语句”,序列for循环语句同意反复遍历一组序列。而这组序列能够是不论什么能够反复遍历的序列。全部C++标准容器数据容器都可用作这样的序列。for中声明引用类型(auto&)能够便于在循环体中改动元素,声明为const auto&能够提高运行的效率。
提示 在遍历Vector容器时候还能够使用C++中迭代器进行遍历。參看代码例如以下。
Vector中定义了相关的begin()和end()函数。
for (Vector<Sprite*>::const_iterator it = this->list.begin(); it != this->list.end(); ++it)
{
int x = CCRANDOM_0_1() * visibleSize.width;
int y = CCRANDOM_0_1() * visibleSize.height;
Sprite* sprite = *it; //解引用操作符(*操作符)来訪问迭代器所指向元素 sprite->setPosition( Vec2(x, y) );
this->removeChild(sprite);
this->addChild(sprite);
}
本书交流讨论站点:http://www.cocoagame.net
《Cocos2d-x实战 C++卷》现已上线,各大商店均已开售:
京东:http://item.jd.com/11584534.html
当当:http://product.dangdang.com/23606265.html
互动出版网:http://product.china-pub.com/3770734
《Cocos2d-x实战 C++卷》源代码及样章下载地址:
Cocos2d-x中Vector<T>容器以及实例介绍的更多相关文章
- Cocos2d-x中Vector<T>容器以及实例介绍
Vector<T> 是Cocos2d-x 3.x推出的列表容器,因此它所能容纳的是Ref及子类所创建的对象指针,其中的T是模板,表示能够放入到容器中的类型,在Cocos2d-x 3.x中T ...
- Cocos2d-x中__Dictionary容器以及实例介绍
__Dictionary类在Cocos2d-x 2.x时代它就是CCDictionary类,它是模仿Objective-C中的NSDictionary类而设计的,通过引用计数管理内存.__Dictio ...
- Cocos2d-x中__Array容器以及实例介绍
__Array类在Cocos2d-x 2.x时代它就是CCArray类.它是模仿Objective-C中的NSArray类而设计的,通过引用计数管理内存.__Array继承于Ref类,因此它所能容纳的 ...
- C++中 vector(容器)的用法
vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: 1.文件包含: ...
- c++中vector等容器的实现机制
stl容器区别: vector list deque set map-底层实现 stl容器区别: vector list deque set map (转) 在STL中基本容器有: vector.li ...
- C++中vector容器的常用操作方法实例总结
C++中vector容器的常用操作方法实例总结 参考 1. C++中vector容器的常用操作方法实例总结: 完
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下: C++ Code 1 2 template < class _Ty, cl ...
- c++中vector的用法详解
c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...
- C++中vector的用法
C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头 ...
随机推荐
- DocumentFragment批量操作dom
DocumentFragment,文档片段,不属于文档树,其parentNode为null.当把一个DocumentFragment节点插入文档树时,插入的不是DocumentFragment自身,而 ...
- 【HDOJ5558】Alice's Classified Message(后缀数组)
题意:给定一个长度为n的下标从0开始的小写字母字符串,每次对于当前的i寻找一个j使得后缀i与后缀j的lcp最大,(j<i)若lcp相同则取较小的 若lcp为0则输出0与当前字符,i自增1,否则输 ...
- 【HDOJ5977】Garden of Eden(点分治)
题意:给定一棵n个点的树,每个节点上有一种颜色a[i],一共有k种颜色,问包含所有颜色的路径条数 n<=5e4,k<=10 思路:点分治求方案数 集合并卷积的时候暴力枚举状态即可O(n^l ...
- The type or namespace name 'Html' does not exist in the namespace 'System.Web.Mvc' (are you missing an assembly reference?)
The type or namespace name 'Html' does not exist in the namespace 'System.Web.Mvc' (are you missing ...
- Linux Mint---安装篇
先前接触过Debian6,埋头折腾已经是好几年前的事情了,后来就放下了,现在工作之余时间比较多,正好debian8.1出来了,于是乎装了个debian用,结果,自己其实还是一个菜蛋而已,连软件源怎么设 ...
- linux下kodi没有声音的解决
前几天,心血来潮,就安装了manjaro的pre3版本,由于是mini kde版本的,就随手安装了kodi,可以用来看视频,听音乐和看图片. 结果在所有插件都折腾好了之后发现,在屏幕的右上角有一个喇叭 ...
- AC日记——石子归并 51nod 1021
石子归并 思路: 经典动态规划——归并类问题: 我们把状态划为n个,即1-n的n个长度为n个状态: 那么,每个长度为i的状态都可以由i-1个长度为i-1的状态推出: 所以,dp转移方程: dp[i][ ...
- Codeforces 899 B.Months and Years
B. Months and Years time limit per test 1 second memory limit per test 256 megabytes input standar ...
- Mysql varchar长度问题
http://dinglin.iteye.com/blog/914276 http://www.cnblogs.com/fakis/archive/2011/03/07/1976532.html ...
- Codeforces 915F Imbalance Value of a Tree(并查集)
题目链接 Imbalance Value of a Tree 题意 给定一棵树.求树上所有简单路径中的最大权值与最小权值的差值的和. 首先考虑求所有简单路径中的最大权值和. 对所有点按照权值大小升 ...