ValueVector和Vector不得不说的故事
2014-09-15 21:36
218 查看
不得不说的故事鱼与熊掌不可兼得,类似这种例子生活中会经常碰到。同样的,如果你有去了解过Cocos2d-x 3.0,也会遇到这样一个令人纠结的情况 -- Value 与 Vector(Map)。
为什么这么说呢?且听我慢慢道来。
在Cocos2d-x 2.0版本,我们要存储一个int型数据,应该放到哪里?没错,放到CCArray中,如下:
如果要存储一个CCObject对象,又是用什么存呢?是的,又是CCArray:
在Cocos2d-x3.0版本,我们都知道该版本的CCArray已经被甩了(实际上用__Array也还是可以替用一下),那么要存储一个Ref(3.0后CCObject改名为Ref)对象应该如何操作?机智的我马上想到了CCArray的替代者:Vector,示例代码如下:
接下来问题来了,如果要存储一个数据类型,如int型数据,那么用Vector可以实现吗?答案是否定的,在Vector的官方说明文档里有这么一句话:
cocos2d::Vector<T> 中的T必须是一个指向cocos2d::Ref子类对象的指针。不能是其他数据类型或者原生类型,因为我们已经将 Cocos2d-x 的内存管理模型集成到 cocos2d::Vector<T> 中。
既然Vector容不下数据类型的元素,那么肯定有可以替代它的东西存在。没错,ValueVector登上了历史舞台。
先到CCValue.h头文件中看下它的声明:
可以看出,ValueVector实际上就是一个存放Value类型元素的std::vector容器,这里和我之前的猜测有些出入。下面将几个int型数据存储到ValueVector中。
上面代码就是创建两个int型的变量,然后放入ValueVector中,其中要注意的是:因为ValueVector中只能存放Value类型的元素,所以int型的a、b变量必须转换成Value类型后才能放入到ValueVector中。
说到ValueVector,那就顺便提下它的一些简单操作:
1、读取Plist(xml)配置文件。如下:
不过用ValueVector读取的plist文件只局限于是该plist的格式的以array数组类型开头的,例如下面这种:
如果是以dict字典类型开头的文件,则要换用ValueMap,这是下一篇的内容,先跳过。
2、往ValueVector中插入一个元素。上面有提到过,ValueVector实际上就是一个存放Value类型的vector顺序容器,所以它的插入元素方式可以直接使用vector顺序容器的操作。示例如下:
3、提取ValueVector中的元素。这里我接上面的例子来用:
上面的代码比较容易理解,就是提取star_val中放在0和1位置上的元素,然后分别转成int型和string型。asInt()与asString()是Value用来实现类型转换的函数。
4、删除ValueVector中的元素,容器中比较常用的删除元素方式有三种:
1)删除容器中最后一个元素:
2)用erase删除容器中的某一个元素?为什么我要在前面加个问号呢?假设我要删除star_val中的 元素a,代码如下:
上面两行代码信息量还是比较大的,首先我们要知道erase 删除的是由一个迭代器指向的单个元素,而不是直接这样:
这种操作是错误的,那么,什么是迭代器呢?
假设一个教室就是一个vector容器,每个学生都是vector中的一个元素,而学生对应的座号就是迭代器。
erase里的参数须是一个迭代器,那么a元素对应的迭代器是什么呢?这里就要用到find算法,它将返回a在容器中的迭代器。
但是,这种删除元素的方式是无法编译成功的!因为Value里没有重载==运算符,而std::find里面的数据类型必须实现==运算符,所以没法用查找,也就没法删除。
3)既然无法删除指定的元素,那将全部元素都删除总可以吧?答案是肯定的:
用clear删除全部元素。
好了,ValueVector的用法说到这里,最后做下总结和补充:
1、Vector只能用来存放Ref类型的元素,不能存放数据类型的元素;
2、ValueVector只能用来存放Value类型的元素,因为Value说到底就是数据类型,所以也可以认为ValueVector只能用来存放数据类型,千万别将Ref类型的元素放进入,否则会很刺激。
3、ValueVector中可以放ValueVector,前提是将ValueVector转成Value类型;而Vector中不能存放Vector类型的元素,如下:
推荐阅读:
cocos2d::Vector
cocos2d::Value
浅谈容器Vector & Value
C++标准库:STL之使用std::find
来源网址:http://blog.csdn.net/star530/article/details/37834689
为什么这么说呢?且听我慢慢道来。
在Cocos2d-x 2.0版本,我们要存储一个int型数据,应该放到哪里?没错,放到CCArray中,如下:
cocos2d::Vector<T> 中的T必须是一个指向cocos2d::Ref子类对象的指针。不能是其他数据类型或者原生类型,因为我们已经将 Cocos2d-x 的内存管理模型集成到 cocos2d::Vector<T> 中。
既然Vector容不下数据类型的元素,那么肯定有可以替代它的东西存在。没错,ValueVector登上了历史舞台。
先到CCValue.h头文件中看下它的声明:
说到ValueVector,那就顺便提下它的一些简单操作:
1、读取Plist(xml)配置文件。如下:
2、往ValueVector中插入一个元素。上面有提到过,ValueVector实际上就是一个存放Value类型的vector顺序容器,所以它的插入元素方式可以直接使用vector顺序容器的操作。示例如下:
4、删除ValueVector中的元素,容器中比较常用的删除元素方式有三种:
1)删除容器中最后一个元素:
假设一个教室就是一个vector容器,每个学生都是vector中的一个元素,而学生对应的座号就是迭代器。
erase里的参数须是一个迭代器,那么a元素对应的迭代器是什么呢?这里就要用到find算法,它将返回a在容器中的迭代器。
但是,这种删除元素的方式是无法编译成功的!因为Value里没有重载==运算符,而std::find里面的数据类型必须实现==运算符,所以没法用查找,也就没法删除。
3)既然无法删除指定的元素,那将全部元素都删除总可以吧?答案是肯定的:
好了,ValueVector的用法说到这里,最后做下总结和补充:
1、Vector只能用来存放Ref类型的元素,不能存放数据类型的元素;
2、ValueVector只能用来存放Value类型的元素,因为Value说到底就是数据类型,所以也可以认为ValueVector只能用来存放数据类型,千万别将Ref类型的元素放进入,否则会很刺激。
3、ValueVector中可以放ValueVector,前提是将ValueVector转成Value类型;而Vector中不能存放Vector类型的元素,如下:
cocos2d::Vector
cocos2d::Value
浅谈容器Vector & Value
C++标准库:STL之使用std::find
来源网址:http://blog.csdn.net/star530/article/details/37834689
相关文章推荐
- ValueVector和Vector不得不说的故事
- Cocos2dx 3.0 过渡篇(三十一)ValueVector和Vector不得不说的故事
- Cocos2dx 3.0 过渡篇(三十一)ValueVector和Vector不得不说的故事
- vector不得不说的故事
- ValueVector和Vector不得不说的故事
- 产品经理和原型设计不得不说的故事
- 我和DELPHI不得不说的故事之-------数据库(上)
- 10、Cocos2dx 3.0游戏开发找小三之容器篇:Vector、Map、Value
- 《我与Android不得不说的故事-1-立贴明志》
- Tomcat Reload,不得不说的故事
- 【耗子啃过的SEO之入门知识一】度娘和新站不得不说的故事
- int, float, double之间不得不说的故事
- 10、Cocos2dx 3.0游戏开发找小三之容器篇:Vector、Map、Value
- 【CDOJ 1355】柱爷与三叉戟不得不说的故事 【状压DP+子集枚举】
- 2008年微软(北京).NET俱乐部年会 - 小品:我和盗版不得不说的故事
- 51CTO六周年,我不得不说的话!【我与51CTO的故事】
- Eigen vector and eigen value
- 一个让人不得不转的故事-《通宵达旦工资只有3200 博客网架构师艰难浪迹于北京》
- 编译FFMpeg不得不说的故事
- int, float, double之间不得不说的故事