1.定义和背景

cocos2d::Vector<T> 是一个封装了动态大小的数组的顺序型容器。

它的元素是连续存储的,cocos2d::Vector<T> 的存储是自动处理的。其内部的数据结构实现实际上是STL标准的顺序型容器 std::vector。

在 Cocos2d-x v3.0 beta 之前,存在另一个顺序性容器 cocos2d::CCArray,这将会被弃用。

官方很细致地设计了 cocos2d::Vector<T> 容器作为 cocos2d::CCArray 的替代品,所以我们要使用 cocos2d::Vector<T> 代替 cocos2d::CCArray。这种数组的插入数据的方式和删除数据的方法有很多,而且也很灵活,既可以当表,也可以当栈

2.数据类型

T - 元素类型.
-T 必须是一个指向 cocos2d::Object 子类对象的指针。不能是其他数据类型或者原生类型,因为Cocos2d-x 的内存管理模型已经集成到 cocos2d::Vector<T> 中(从 v3.0 beta 开始)。

3.创建和释放

_data 的内存管理是由编译器自动处理的。如果你在栈上声明了一个 cocos2d::Vector<T> 对象,那就不需要关心内存释放问题。

如果你调用了 new 操作符来分配一块 cocos2d::Vector<T> 的动态内存,那就需要在使用完后调用 delete 操作符来释放内存。这同样适用于 new[] 和 delete[]。

注意:在新 C++ 中,它倾向于本地存储对象而不是堆存储对象。所以,请不要调用 new 操作符来分配 cocos2d::Vector<T> 的堆对象,而是使用栈对象来代替它。
 
 
 

4.具体用法

//用一个容量初始化一个 vector

Vector<Sprite*>  vec1(5);

//定义一个数组要在HelloWorld类的属性中定义,语法是Vector<某个对象的类名*> 数组名;

Vector<GameController*> gcs;

//在一个确定的位置插入一个确定的对象(这里是在位置0插入一个Sprite类型的sp1变量指针)

vec1.insert(0, sp1);

//我们也可以加入一整个 vector

vec1.pushBack(*vec0);

//从 vector 中移除元素

1.vec1.erase(vec1.find(sp0));  //sp0是一个对象实例,可以是节点,精灵或者其他一些数据类型

2.pVec1->erase(1); //下标为1的变量

3.pVec1->eraseObject(sp0,true);  //sp0是一个对象实例,可以是节点,精灵或者其他一些数据类型,这个方法在移除一个元素后,其他元素的位置就会发生变化,比如

   auto it = lifes.begin();

(*it)->removeFromParent();

lifes.eraseObject((*it), true);

移除后,原来在1号位的变量就变成0号位了,也就是lifes.begin();用这个方法可以做一个血量减少,爱心从右往左减少的效果

4.pVec1->popBack();

5.vec1.clear(); //移除所有元素

//其他用法

//如果两个vector 相同的话返回真

if (vec0->equals(vec2)) {

log("pVec0 is equal to pVec2");

}

//判断vector是否为空

if (!vec1.empty()) {

//获取 vector 的 capacity 和 size,要注意的是 capacity 并不一定等于 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);  //通过索引交换 vector 中的两个元素

vec1.swap(vec1.front(), vec1.back());  //通过值交换 vector 中的两个元素

if (vec2.contains(sp0)) {  //返回一个布尔值,用于指示该对象是否存在于 vector 中

log("The index of sp0 in pVec2 is %zd",vec2.getIndex(sp0));

}

}

5.遍历

如果要遍历某个数组,要用到数组对象的begin()方法和end()方法,再定义一个指向各个具体对象的指针,这个指针值加1的时候,所指向的实例对象会后移一个,初始时让它指向第一个实例

for (auto it = gcs.begin(); it != gcs.end(); it++) {
  (*it)->onUpdate();

}

注意:如果我们在插入数据的时候是每个都在0的位置插入的话

pic.insert(0, pic1);

pic.insert(0, pic2);

pic.insert(0, pic3);

pic.insert(0, pic4);

那么各个变量在数组中的顺序是

pic4--pic3---pic2---pic1

所以遍历起来的话是pic4为pic.begin(),产生了一个倒序的效果,并不是因为数组是什么先进后出,那是错误的思维,这个数组的遍历还是老老实实按照从左往右从0下标位开始的顺序的。

6.详解(*it)=sprite

如果定义了auto sprite=Sprite::create();之类的精灵节点,那么在

for (auto it = gcs.begin(); it != gcs.end(); it++) {
  (*it)->onUpdate();

}

中,(*it)=sprite,而不是it=sprite,所以it是一个指向精灵节点指针的指针

  1. //从 vector 中移除元素
  2. vec1.erase(vec1.find(sp0));
  3. //pVec1->erase(1);
  4. //pVec1->eraseObject(sp0,true);
  5. //pVec1->popBack();
  6. vec1.clear(); //移除所有元素

关于Cocos2d-x中数组的使用的更多相关文章

  1. JavaScript中数组操作常用方法

    JavaScript中数组操作常用方法 1.检测数组 1)检测对象是否为数组,使用instanceof 操作符 if(value instanceof Array) { //对数组执行某些操作 } 2 ...

  2. jq中数组应用的错误

    js中数组可以这样使用: <ul id="ul"> <li value="1">s</li> <li>f< ...

  3. C++程序设计(关于函数中数组传递的一点心得)

    题目: 10个学生考完期末考试评卷完成后,老师需要划出及格线,要求如下: (1) 及格线是10的倍数: (2) 保证至少有60%的学生及格: (3) 如果所有的学生都高于60分,则及格线为60分:   ...

  4. java中数组的相关知识

      1. 2.数组的命名方法 1)int[]ages=new int[5]; 2) int[]ages; ages=new int[5]; 3)int[]ags={1,2,3,4,5}; 4)int[ ...

  5. C#中数组Array、ArrayList、泛型List<T>的比较

    在C#中数组Array,ArrayList,泛型List都能够存储一组对象,但是在开发中根本不知道用哪个性能最高,下面我们慢慢分析分析. 一.数组Array 数组是一个存储相同类型元素的固定大小的顺序 ...

  6. javascript中数组Array的方法

    一.常用方法(push,pop,unshift,shift,join)push pop栈方法,后进先出var a =[1,2,3];console.log(a.push(40)); //4 返回数组的 ...

  7. C#中数组、ArrayList和List三者的区别

    在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...

  8. iOS: 使用KVO监听控制器中数组的变化

    一.介绍: KVO是一种能动态监听到属性值的改变的方式,使用场景非常广泛,这里我只讲如何监听控制器ViewController中数组的变化. 二.了解: 首先我们应该知道KVO是不能直接监听控制器Vi ...

  9. Java中数组的特性

    转载:http://blog.csdn.net/zhangjg_blog/article/details/16116613 数组是基本上所有语言都会有的一种数据类型,它表示一组相同类型的数据的集合,具 ...

  10. 在java 中,数组与 List<T> 类型的相互转换

    在java中,数组与List<T> 之前进行互相转换,转换方法可总结为以下几种: 一. 将 数组转换成List<T> 1. 使用 Collections 的addAll 方法 ...

随机推荐

  1. C/S程序的一般流程和基本socket函数

    一.基于TCP协议的网络程序 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的 ...

  2. rpm安装PostgreSQL

    一.首先去官网下载相关的安装包 https://yum.postgresql.org/rpmchart.php 二.下载安装包 1. 最小的数据库服务器安装包: postgresql96--1PGDG ...

  3. Spring Cloud Netflix概览和架构设计

    Spring Cloud简介 Spring Cloud是基于Spring Boot的一整套实现微服务的框架.他提供了微服务开发所需的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策 ...

  4. 《Effective Java》读书笔记四(泛型)

    Java1.5发行版本中增加了泛型(Generic).在没有泛型之前,从集合中读取到的每一个对象都必须进行转换.如果有人不小心插入了错误的类型对象,在运行时的转换处理就会出错.有了泛型之后,可以告诉编 ...

  5. Common Probability Distributions

    Common Probability Distributions Probability Distribution A probability distribution describes the p ...

  6. python搭建简易服务器实例参考

    有关python搭建简易服务器的方法. 需求分析: 省油宝用户数 已经破了6000,原有的静态报表 已经变得臃肿不堪, 每次打开都要缓上半天,甚至浏览器直接挂掉 采用python搭建一个最最简易的 w ...

  7. NEXYS 3开发板练手--USB UART(一)

    接上一篇文章,今天来讲讲这个USB UART串口发送机. 我们知道,当我们的微处理器(单片机.FPGA.DSP等)要和电脑进行通信的时候一般会采用串行通信方式,而最常用的串行通信协议的物理层接口是RS ...

  8. boost.asio源码剖析(三) ---- 流程分析

    * 常见流程分析之一(Tcp异步连接) 我们用一个简单的demo分析Tcp异步连接的流程: #include <iostream> #include <boost/asio.hpp& ...

  9. C do {...} while (0) 在宏定义中的作用

    如果你是一名C程序员,你肯定很熟悉宏,它们非常强大,如果正确使用可以让你的工作事半功倍.然而,如果你在定义宏时很随意没有认真检查,那么它们可能使你发狂,浪费N多时间.在很多的C程序中,你可能会看到许多 ...

  10. C++ 11 创建和使用 shared_ptr

    shared_ptr 的类型是C + +标准库中一个聪明的指针,是为多个拥有者管理内存中对象的生命周期而设计的.在你初始化一个 shared_ptr 后,你可以复制它,把函数参数的值递给它,并把它分配 ...