介绍

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和引用计数内存管理。

基本使用方法

  1. Vector<Sprite*>mVector;
  2.  
  3. Sprite* sp1 = Sprite::create();
  4. sp1->setTag(1);
  5. Sprite* sp2 = Sprite::create();
  6. sp2->setTag(2);
  7. Sprite* sp3 = Sprite::create();
  8. sp3->setTag(3);
  9. Sprite* sp4 = Sprite::create();
  10. sp4->setTag(4);
  11.  
  12. mVector.pushBack(sp1); //pushBack操作将保留传递过来的參数
  13. mVector.pushBack(sp2);
  14. mVector.pushBack(sp3);
  15. mVector.pushBack(sp4);
  16.  
  17. for (Sprite* obj : mVector)
  18. {
  19. log("obj=%d", obj->getTag());
  20. }
  21.  
  22. log("===================== pushBack切割线 ======================");
  23.  
  24. mVector.insert(0, sp2); //insert插入数据下标从0開始
  25.  
  26. for (Sprite* obj : mVector)
  27. {
  28. log("obj=%d", obj->getTag());
  29. }
  30.  
  31. log("===================== insert切割线 ======================");
  32.  
  33. mVector.popBack(); //移除最后一个元素
  34.  
  35. for (Sprite* obj : mVector)
  36. {
  37. log("obj=%d", obj->getTag());
  38. }

输出日志为:

  1. obj=1
  2. obj=2
  3. obj=3
  4. obj=4
  5. ===================== pushBack切割线 ======================
  6. obj=2
  7. obj=1
  8. obj=2
  9. obj=3
  10. obj=4
  11. ===================== insert切割线 ======================
  12. obj=2
  13. obj=1
  14. obj=2
  15. obj=3

算法使用

  1. Sprite* sp0 = Sprite::create();
  2.  
  3. Vector<Sprite*>::iterator it = mVector.find(sp0); //std::find算法使用
  4.  
  5. if (it != mVector.end()){
  6. log("find!");
  7. }
  8. else{
  9. log("not find!");
  10. }
  11.  
  12. mVector.reverse(); //顾名思义,逆转容器里面的元素
  13.  
  14. mVector.swap(0, 1); //交换其位置
  15.  
  16. for (Sprite* obj : mVector)
  17. {
  18. log("obj=%d", obj->getTag());
  19. }
  20.  
  21. log("size=%d", mVector.size());
  22.  
  23. mVector.clear();
  24. log("size=%d", mVector.size());

cocos2d-x-3.1 数据结构之Vector (coco2d-x 学习笔记六)的更多相关文章

  1. 数据结构与算法C++描述学习笔记1、辗转相除——欧几里得算法

    前面学了一个星期的C++,以前阅读C++代码有些困难,现在好一些了.做了一些NOI的题目,这也是一个长期的目标中的一环.做到动态规划的相关题目时发现很多问题思考不通透,所以开始系统学习.学习的第一本是 ...

  2. 数据结构与算法之美学习笔记:B+树(第48讲)

    一.解决问题的前提是定义清楚问题 通过对一些模糊需求进行假设,来限定要解决问题的范围 根据某个值查找数据,比如 select * from use where id=1234: 根据区间值来查询某些数 ...

  3. 数据结构(java版)学习笔记(序章)

    程序=数据结构+算法 序章做一个简单的思维导图,方便理解数据结构这门课的大纲,接下来我们将是按照线性表,栈,队列,串,树和图的顺序依次往下学.

  4. 数据结构(java版)学习笔记(一)——线性表

    一.线性表的定义 线性表是n(n>=0)个具有相同特性的数据元素的有限序列. 线性表是最简单.最常用的一种数据结构 线性表属于线性结构的一种 如果一个数据元素序列满足: (1)除第一个和最后一个 ...

  5. Java基础学习笔记(六) - 数据结构和集合

    一.认识数据结构 1.数据结构有什么用? 合理的使用数据结构,可以更方便的查找存储数据. 2.常见的数据结构 数据存储常用结构有:栈.队列.数组.链表和红黑树. 栈:堆栈(stack),它是运算受限的 ...

  6. 【数据结构与算法Python版学习笔记】引言

    学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...

  7. 【数据结构与算法Python版学习笔记】目录索引

    引言 算法分析 基本数据结构 概览 栈 stack 队列 Queue 双端队列 Deque 列表 List,链表实现 递归(Recursion) 定义及应用:分形树.谢尔宾斯基三角.汉诺塔.迷宫 优化 ...

  8. 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链

    散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...

  9. 【数据结构与算法Python版学习笔记】基本数据结构——列表 List,链表实现

    无序表链表 定义 一种数据项按照相对位置存放的数据集 抽象数据类型无序列表 UnorderedList 方法 list() 创建一个新的空列表.它不需要参数,而返回一个空列表. add(item) 将 ...

随机推荐

  1. Python之数据聚合与分组运算

    Python之数据聚合与分组运算 1. 关系型数据库方便对数据进行连接.过滤.转换和聚合. 2. Hadley Wickham创建了用于表示分组运算术语"split-apply-combin ...

  2. PLC学习资料

    常用字母 X 输入点(I)可连接外部输入信号 如感应器或限位/按钮等M 内部辅助继电器S 内部步进 不作步进使用时,可用作内部辅助继电器T 时间继电器 内部使用C计数器 内部使用Y输出点(O)输出给外 ...

  3. MyBatis 之一 简介

    什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

  4. 常用Linux命令(长期更新)

    有些命令如果不常用,老是记不住,每每用到总还要去查,特此将一些命令记录在此: (0)按指定时间删除文件 find target_dir -type f -mtime +3 -exec rm {} \; ...

  5. MySql学习笔记(三) —— 聚集函数的使用

    1.AVG() 求平均数 select avg(prod_price) as avg_price from products; --返回商品价格的平均值 ; --返回生产商id为1003的商品价格平均 ...

  6. VMware 12虚拟机下Ubuntu 16连不上网解决方法

    打开自带Firefox浏览器,显示连接不上网,终端下 ping 也显示 unkown   解决方法: 1.打开虚拟机的“编辑”选项,选择“虚拟网络编辑器” 2.选择VMnet8(我不知道为啥VMnet ...

  7. phpExcel导出excel打不开问题

    用wps和office都打不开,使用旧版的office打开了 出现了一些 warming警告,虽然warming不影响函数的执行,但是php导出excel文件,是header出来的.这个warning ...

  8. 25款css动画库

    http://www.swiper.com.cn/usage/animate/index.html   //swiper https://cssanimation.io/ http://ianlunn ...

  9. [Algorithm] 9. Two Sum

    Description Given an array of integers, return indices of the two numbers such that they add up to a ...

  10. 00 大王警语--be_a_new_gentleman

    大王博客:https://www.cnblogs.com/alex3714/ # 表面层次# 1,着装特体(服饰的牌子中高端)# 2,每天洗澡# 3,适当用香水# 4,女士优先# 5,不随地吐痰.不乱 ...