Value和ValueVector的区别
来源:互联网 发布:java 获取本地路径 编辑:程序博客网 时间:2024/06/10 17:37
前天看到一个颇为纠结的选择题:有一天你遇到一个外星人,这时外星人很热情的邀请你到他们星球去玩,你如何选
1:去,但是你有可能永远不能在回来。2:不去,但是外星人会消去你的记忆
------------------
鱼与熊掌不可兼得,类似这种例子生活中会经常碰到。同样的,如果你有去了解过Cocos2dx3.0,也会遇到这样一个令人纠结的情况:
那就是:Value 与 Vector(Map)。
为什么这么说呢?且听我慢慢道来。
-----------------
在Cocos2dx 2.0版本,
我们要存储一个int型数据,应该放到哪里?没错,放到CCArray中,如下:
- int i = 10;
- CCArray _array = CCArray::create();//创建一个CCArray数组
- _array->addObject(CCInteger::create(i));//将int型数据放入数组中
- CCSprite* sp = CCSprite::create("star.png");//创建一个精灵
- ...
- _array->addObject(sp);//将精灵放入到数组中
在Cocos2dx3.0版本,
我们都知道该版本的CCArray已经被甩了(实际上用__Array也还是可以替用一下),那么要存储一个Ref(3.0后CCObject改名为Ref)对象应该如何操作?机智的我马上想到了CCArray的替代者:Vector,示例代码如下:
- auto sp = Sprite::create("star.png");
- ...
- Vector<Sprite*> sp_vec;//创建一个Sprite*类型的容器
- sp_vec.pushBack(sp);//将精灵放入到容器中
接下来问题来了,如果要存储一个数据类型,如int型数据,那么用Vector可以实现吗?答案是否定的,在Vector的官方说明文档里有这么一句话:
cocos2d::Vector<T> 中的T必须是一个指向cocos2d::Ref子类对象的指针。不能是其他数据类型或者原生类型,因为我们已经将 Cocos2d-x 的内存管理模型集成到 cocos2d::Vector<T> 中。
有句话叫什么来着:上帝为你关上了一扇门,一定会为你打开一扇窗...此处不留爷,自有留爷处...既然Vector容不下数据类型的元素,那么肯定有可以替代它的东西存在。没错,ValueVector登上了历史舞台。
第一次看到ValueVector时我就愣住了,这货又是什么碗糕?几秒后我反应过来,这货肯定是Value与Vector的私生子,我实在太特么机智了,这么抽象的命名都能让我快速想到答案,心中不禁暗自得意。
先到CCValue.h头文件中看下它的声明:
- typedef std::vector<Value> ValueVector;
- int a = 10;
- int b = 20;
- ValueVector val_vec;
- val_vec.push_back(Value(a));
- val_vec.push_back(Value(b));
上面代码就是创建两个int型的变量,然后放入ValueVector中,其中要注意的是:因为ValueVector中只能存放Value类型的元素,所以int型的a、b变量必须转换成Value类型后才能放入到ValueVector中。
关于Value的一些用法,可以看之前的博客:http://blog.csdn.net/star530/article/details/21651751
------------------------------------------------------------------------------------------------------------
说到ValueVector,那就顺便提下它的一些简单操作:1、读取Plist(xml)配置文件。如下:
- ValueVector star_val = FileUtils::getInstance()->getValueVectorFromFile("star.plist");
- <array>
- <dict>
- <key>name</key>
- <string>star</string>
- <key>isCool</key>
- <string>yes</string>
- </dict>
- </array>
2、往ValueVector中插入一个元素。上面有提到过,ValueVector实际上就是一个存放Value类型的vector顺序容器,所以它的插入元素方式可以直接使用vector顺序容器的操作。示例如下:
- int a = 10;
- std::string b = "star is so cool";
- ValueVector star_val;
- star_val.push_back( Value(a) );
- star_val.push_back( Value(b) );//放入ValueVector前都要先将类型转成Value类型
3、提取ValueVector中的元素。这里我接上面的例子来用:
- int a1 = star_val.at(0).asInt();
- std::string b1 = star_val.at(1).asString();
- CCLOG("a1 = %d ,b1 = %s",a1,b1);
4、删除ValueVector中的元素。容器中比较常用的删除元素方式有三种:
1)删除容器中最后一个元素,
- star_val.pop_back();//直接删除容器中最后一个元素
- auto star_iter = std::find(star_val.begin(),star_val.end(),a);
- star_val.erase(star_iter);
star_val.erase(a);
这种操作是错误的,那么,什么是迭代器呢?我举个小例子:
“第3列、第5排那个搞小动作的童鞋......别指了,说的就是你,你特么给我滚出去”
最后,我不得不羞涩的告诉大家,这种删除元素的方式是无法编译成功的!!!因为Value里没有重载==运算符,而std::find里面的数据类型必须实现==运算符,所以没法用查找,也就没法删除。
看到这里有人肯定要拍桌子了:尼玛,这方法不能删除你写这么多干嘛?裤子都脱了你就给我看这个?&……%*。
我的回答是:呵呵...知道我当初折腾这个erase用了多少时间么?没错!我现在就是报复社会的节奏!不拿你们乐呵乐呵偶心里不痛快~!
3)请收起手里愤怒的西瓜刀,深吸一口气。既然无法删除指定的元素,那我破罐子破摔,将全部元素都删除总可以吧?答案是肯定的:
- star_val.clear();
-----------------------------------------------------------------------------------------------------------------------
好了,ValueVector的用法说到这里,最后做下总结和补充:1、Vector只能用来存放Ref类型的元素,不能存放数据类型的元素;
2、ValueVector只能用来存放Value类型的元素,因为Value说到底就是数据类型,所以也可以认为ValueVector只能用来存放数据类型,千万别将Ref类型的元素放进入,否则会很刺激。
3、ValueVector中可以放ValueVector,前提是将ValueVector转成Value类型;而Vector中不能存放Vector类型的元素,如下:
- ValueVector star_val;
- ValueVector star_val2;
- star_val.push_back( Value(star_val2) );//正确
- Vector< Vector<Ref*> > star_vec;//错误!
OK,就写到这里吧。
----------------------------------------------------------------------------------------------------------------------
尊重原创,转载请注明来源:http://blog.csdn.net/star530/article/details/37834689 0 0
- Value和ValueVector的区别
- ValueVector和Vector的故事
- Vector和ValueVector
- ValueVector和Vector
- value和placeholder 的区别
- innerHTML和value的区别
- value和val()的区别
- nodeValue和value的区别
- value和ref的区别
- val()和.value的区别和用法
- xml文件中的sql里的#value#和$value$区别
- Value Type和Reference Type的区别
- jquery val() 和 value 的区别
- XmlNode中Value和InnerText的区别
- KeyValue Class key和value的区别
- XmlNode中Value和InnerText的区别
- js中innerHTML和value的区别
- jQuery attr("value") 和 val的区别
- 【参考】assert 断言
- UIView扩展,很实用
- 到底什么是VPN和究竟为什么它要
- 最小生成树 ———prim算法 poj 1258
- 如何将自己的私有MIB放在MIB Broswer下浏览
- Value和ValueVector的区别
- java数据转json数据
- nginx图片、css、js缓存
- navicat 结合快捷键 非常好用
- CoreData功能初窥
- HDOJ 1253 胜利大逃亡
- 第一范式,第二范式,第三范式
- QTableWidget
- spring整合hibernate的声明式事务管理