Cocos2d-x3.0模版容器具体解释之二:cocos2d::Map<K,V>
1.概述:
版本号: v3.0 beta
语言: C++
定义在 “COCOS2DX_ROOT/cocos/base” 路径下的 "CCMap.h" 的头文件里。
template <class K, class V>
class CC_DLL Map;
cocos2d::Map<K,V> 是一个内部使用了 std::unordered_map的关联容器模版。
std::unordered_map 是一个存储了由key-value键值对组合成构成的关联性容器,同意基于键对单个元素进行高速检索。
在 unordered_map 中,key value 一般用来标识唯一的一个元素,而 mapped value 是一个对象,其内容关联到对于的 key value。
在内部,unordered_map 的元素并不依赖于 key 或者 mapped 值来使用不论什么的特定方式排序,而是取决于它们的哈希值,以便通过他们的key值高速訪问单个元素(使用平均时间复杂度)。
在 Cocos2d-x v3.0 beta 之前,存在还有一个顺序性容器 cocos2d::CCDictionary,这将会被弃用。
我们非常仔细地设计了 cocos2d::Map<K,V> 容器作为 cocos2d::CCDictionary 的替代品,所以请使用 cocos2d::Map 取代 cocos2d::CCDictionary。
2.模板參数:
K - key value的类型.
unordered_map 中的每个元素都由它的 key value 唯一标识。
V - mapped value的类型.
T 必须是一个指向 cocos2d::Object 子类对象的指针。不能是其它数据类型或者原生类型,由于我们已经将 Cocos2d-x 的内存管理模型集成到 cocos2d::Map<k,V> 中。
3.内存管理:
cocos2d::Map<K,V> 类包括了唯一一个数据成员:
typedef std::unordered_map<K, V> RefMap;
RefMap _data;
_data 的内存管理是由编译器自己主动处理的。假设你在栈上声明了一个 cocos2d::Map<K,V> 对象,那就不须要关心内存释放问题。
假设你调用了 new 操作符来分配一块 cocos2d::Map<K,V> 的动态内存,那就须要在使用完后调用 delete 操作符来释放内存。这相同适用于 new[] 和 delete[]。
注意:在新 C++ 中,它倾向于本地存储对象而不是堆存储对象。所以,请不要调用 new 操作符来分配 cocos2d::Map<K,V> 的堆对象,而是使用栈对象来取代。
假设你有足够的理由在堆上动态分配 cocos2d::Map<K,V> 的话,请使用智能指针替换原始指针,比方 Shared_ptr,unique_ptr。
警告:cocos2d::Map<K,V> 不再像其它的 cocos2d 类一样使用 retain/release和引用计数内存管理。
4.基本的语法:
警告: cocos2d::Map<K,V> 没有重载 operator[],所以你不能使用像 map 这种操作来试图从 cocos2d::Map<K,V> 获取元素。
很多其它 API 的使用,请參考引擎源代码和 Cocos2d-x 3.0 beta 已实现的測试例。
这里提供一个简单的演示样例:
//create Map<K, V> with default size and add a sprite into it
auto sp0 = Sprite::create();
sp0->setTag(0);
Map<std::string, Sprite*> map0;
std::string mapKey0 = "MAP_KEY_0";
map0.insert(mapKey0, sp0);
log("The size of map is %zd.",map0.size());
//create a Map<K, V> with capacity equals 5
Map<std::string, Sprite*> map1(map0);
std::string mapKey1 = "MAP_KEY_1";
if(!map1.empty()){
auto spTemp = (Sprite*)map1.at(mapKey0);
log("sprite tag = %d", spTemp->getTag());
auto sp1 = Sprite::create();
sp1->setTag(1);
map1.insert(mapKey1, sp1);
//get all keys,stored in std::vector, that matches the object
std::vector<std::string> mapKeyVec;
mapKeyVec = map1.keys();
for(auto key : mapKeyVec)
{
auto spTag = map1.at(key)->getTag();
log("The Sprite tag = %d, MAP key = %s",spTag,key.c_str());
log("Element with key %s is located in bucket %zd",key.c_str(),map1.bucket(key));
}
log("%zd buckets in the Map container",map1.bucketCount());
log("%zd element in bucket 1",map1.bucketSize(1));
//get a random object if the map isn't empty, otherwise it returns nullptr
log("The random object tag = %d",map1.getRandomObject()->getTag());
//find(const K& key) can be used to search the container for an element with 'key'
//erase(const_iterator position) remove an element with an iterator
log("Before remove sp0, size of map is %zd.",map1.size());
map1.erase(map1.find(mapKey0));
log("After remove sp0, size of map is %zd.",map1.size());
}
//create a Map<K, V> with capacity equals 5
Map<std::string, Sprite*> map2(5);
map2.reserve(10); //set capacity of the map
输出:
cocos2d: The size of map is 1.
cocos2d: sprite tag = 0
cocos2d: The Sprite tag = 1, MAP key = MAP_KEY_1
cocos2d: Element with key MAP_KEY_1 is located in bucket 1
cocos2d: The Sprite tag = 0, MAP key = MAP_KEY_0
cocos2d: Element with key MAP_KEY_0 is located in bucket 0
cocos2d: 2 buckets in the Map container
cocos2d: 1 element in bucket 1
cocos2d: The random object tag = 0
cocos2d: Before remove sp0, size of map is 2.
cocos2d: After remove sp0, size of map is 1.
5.最佳实践:
当将 cocos2d::Map<K, V>() 作为參数进行传递的时候,将它声明为一个常引用,如 const cocos2d::Map<K, V>()&。
T 必须是是一个指向 cocos2d::Object 子类对象的指针,不能是其它数据类型或者原生类型。
Cocos2d-x3.0模版容器具体解释之二:cocos2d::Map<K,V>的更多相关文章
- Cocos2d-x3.0模版容器之中的一个:cocos2d::Vector<T>
版本号:v3.0 beta以后 语言:C++ 定义在 "COCOS2DX_ROOT/cocos/base" 路径下的 "CCVector.h" 的头文件里. t ...
- java常用容器简要性能分析(List。Map。Set)
嗯,实习的时候看到这个,感觉蛮好,这里摘录学习,生活加油: 我曾经害怕别人嘲笑的目光,后来,发现他们的目光不会在我身上停留太久,人们更愿意把目光放在自己身上. 知乎上看到,讲给自己. List Lis ...
- Cocos2D v2.0至v3.x简洁转换指南(三)
Cocos2D 3.3中的注意事项 如果你在使用Cocos2D 3.3+(是SpriteBuilder 1.3+的一部分)你将不得不替分别的换所有存在的UITouch和UITouchEvent为CCT ...
- 如何在Cocos2D 1.0 中掩饰一个精灵(六)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰一个精灵:实现代码 打开HelloWorldLayer.m并 ...
- 如何在Cocos2D 1.0 中掩饰一个精灵(一)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 原帖来自Ray Wunderlich写的精彩的文章 How To ...
- Cocos2D v2.0至v3.x简洁转换指南(二)
触摸处理 我们在稍后将完成Cocos2d 3.0中触摸处理的完整教程.而现在最重要的是知道如何去启用触摸处理在你的CCNode中: self.userInteractionEnabled = TRUE ...
- 如何将各种低版本的discuz版本升级到discuz x3.0
最近在做discuz改版的项目,遇到了很多问题,相信很多拥有discuz论坛的版主,站长和程序猿在升级或改版discuz的过程中遇到过和我一样的问题,所以我开了一个discuz专栏,为大家讲解一下di ...
- cocos2d 2.0和UIKit混合编程, Push CCDirector的时候出现黑屏的天坑
症状 使用cocos2d 2.0和UIKit混合编程, 有一块用cocos2d编写的小程序, 将CCDirector push到一个UINavigationController里面. 虽然事先在后台初 ...
- Drools 7.15.0 docker容器方式部署
关于drools的相关介绍就不再赘述了,关于drools网上的资料都很少,或者都有些老了,最近折腾了一下,记录下安装部署的过程,希望能节省下大家的时间. 一.快速部署 1.拉取基础镜像,命令如下: d ...
随机推荐
- codeblocks + MinGW 以及vc 使用预编译头文件的方法
MinGW编译器: 1.打开工程文件,在工程文件浏览其中,在你要设置为预编译的头文件上,点击鼠标右键,选择“属性(properties)” 你会看到一个多页面的属性框,选择“构建(build)”页面 ...
- QT学习 之 三维饼图绘制
QT里没有相应统计图形的绘制组件 只有手工自己画 效果如图 void aaq::paintEvent( QPaintEvent* ev ) { QPainter painter(this); // 去 ...
- spring bean管理 笔记1
轻量级,无侵入 Bean管理 1 创建applicationContext.xml 2 配置被管理的Bean 3 获取Bean pom.xml配置 <dependency> <gro ...
- IT第十八天 - 类的封装、继承、重载、上周总结★★★
IT第十八天 上午 封装 1.关键字this,是表示该类在实例化时的对象,即this.表示为该对象的属性 2.类的数据保护,set.get方法的写法规则,为了之后的反射机制的读取数据,set方法中对于 ...
- java学习之总结
学的时候忘记写博客,现在java SE学完了一口气把写的代码发了上来没有做什么补充,其中有很多知识漏掉了,学的有点不扎实,接下来写写项目来稳好基础
- A. Liserious战队
Liserious战队是一支活跃在京沪地区的著名密室逃脱战队,在优秀的队长Liserious和芳姐的带领下,打遍天下大大小小的密室逃脱,攻无不克,战无不胜,上天入地无所不能. 世界密室逃脱委员会以IS ...
- Effective C++:条款37:绝不又一次定义继承而来的缺省參数值
因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定 ...
- BeanUtils数据封装与表单JavaBean
一.BeanUtils工具的解释 (1)Apache的Commons组件中.提供了一个实用的工具类BeanUtils,利用它可以方便的将表单数据值填充值Bean中: (2)javax.servlet. ...
- uva 10891 Game of Sum(区间dp)
题目连接:10891 - Game of Sum 题目大意:有n个数字排成一条直线,然后有两个小伙伴来玩游戏, 每个小伙伴每次可以从两端(左或右)中的任意一端取走一个或若干个数(获得价值为取走数之和) ...
- [转]数位dp小记
转载自:http://blog.csdn.net/guognib/article/details/25472879 参考: http://www.cnblogs.com/jffifa/archive/ ...