cocos2d-x 3.0开发笔记---Vector<T>深入学习
cocos2d x 3.0后 官方建议用Vector<T>来代替CCArray,因为他们在std::vector<T>的基础上进行了封装,使用起来更方便,不用去管内存释放问题,由编译器来负责管理内存。
但是T必须是继承了cocos2d的对象的指针,不允许是其他类型,因为会把cocos2d的内存管理模式转换成vector的内存管理模式。
原文在此 : http://www.cocos2d-x.org/docs/manual/framework/native/data-structure/v3/vector/en
1.官方例子
先看看官方给出的使用例子:
//创建一个Sprite对象sp1
auto sp1 = Sprite::create();
sp1->setTag(1);
//初始化vec1 容量为5 T继承自Sprite
Vector<Sprite*> vec1(5);
//在vec1中插入sp1 位置是0
vec1.insert(0, sp1);
//也可以直接放到末尾
vec1.pushBack(*vec0);
//遍历vec1中的元素
for(auto sp : vec1)
{
log("sprite tag = %d", sp->getTag());
}
Vector<Sprite*> vec2(*vec0);
if (vec0->equals(vec2)) { //两个vector进行比较 返回一个bool值
log("pVec0 is equal to pVec2");
}
if (!vec1.empty()) { //判断vec1是否为空
//vec1.capacity()表示vector的容量 vec1.size()表示的里面有多少个元素
if (vec1.capacity() == vec1.size()) {
log("pVec1->capacity()==pVec1->size()");
}else{
vec1.shrinkToFit(); //根据vector中的元素个数对其进行压缩
log("pVec1->capacity()==%zd; pVec1->size()==%zd",vec1.capacity(),vec1.size());
}
//pVec1->swap(0, 1); //根据序号 交换index0和index1的值
vec1.swap(vec1.front(), vec1.back()); //交换 第一个 和最后一个元素的值 if (vec2.contains(sp0)) { //判断vec2是否包含sp0 返回一个bool值 log("The index of sp0 in pVec2 is %zd",vec2.getIndex(sp0)); } //从vec1中移除元素 vec1.find(sp0)从vec1中查找sp0的iterator 范围是(first,last) 如果找到 返回最先找到的哪个 如果没有找到返回last元素 vec1.erase(vec1.find(sp0)); //pVec1->erase(1); 通过序列移除 //pVec1->eraseObject(sp0,true); true表示移除查找到的所有sp0对象 false:只移除找到的第一个sp0 //pVec1->popBack();移除最后一个元素 vec1.clear(); //remove all elements 移除vec1中的所有元素 log("The size of pVec1 is %zd",vec1.size()); }
2.CCVector详解
1.声明
Vector <class*> classVector; class继承自cocos2d类
2.方法或属性
void reserve(ssize_t n) // 重设容量(capacity) ssize_t capacity() const //返回当前容量 (capacity) ssize_t size() const //返回元素个数 bool empty() const//判断是否为空 ssize_t max_size() const//返回vector能管理的最大元素个数 ssize_t getIndex(T object) const//返回object的index值,如果不存在,返回-1 const_iterator find(T object) const//查找对象object,返回一个iterator(迭代器),或者返回last元素 iterator find(T object)//同上 T at(ssize_t index) const//根据index 返回元素 类似T[index] 但cocos封装的Vector中 不能使用T[index]这种方法 T front() const//返回首个元素 T getRandomObject() const//获取随机元素 bool contains(T object) const//判断是否包含obj 返回一个bool值 bool equals(const Vector<T> &other)//判断2个Vector 是否相等 void pushBack(T object)//添加元素 void pushBack(const Vector<T>& other)//把vector中的所有元素添加进当前vector void insert(ssize_t index, T object)//在index位置 插入object void popBack()//移除最后一个元素 void eraseObject(T object, bool toRelease = true)//移除元素object true表示移除最先找到的哪个 false表示移除所有object元素 iterator erase(iterator position)//根据iterator的位置移除元素 iterator erase(iterator first, iterator last)//移除(first,last)这个范围内的元素 iterator erase(ssize_t index)//通过index移除元素 void clear()//清除所有元素 void swap(T object1, T object2)//交换 o1 o2的值 void swap(ssize_t index1, ssize_t index2)//通过index 交换 o1 o2的值 void replace(ssize_t index, T object)//用object 替换index位置的元素 void reverse()//存储 vector void shrinkToFit()//压缩vector