cocos基础教程(4)数据结构介绍之cocos2d::Map<K,V>

1.概述

cocos2d::Map<K,V> 是一个内部使用了 std::unordered_map的关联容器模版。

std::unordered_map 是一个存储了由key-value键值对组合成构成的关联性容器,允许基于键对单个元素进行快速检索。

2.模版参数

K - key value的类型.

  • map中元素都由它的 key值作为唯一标识。

V - mapped value的类型.

  • T 必须是一个指向 cocos2d::Object 子类对象的指针。

3.内存管理

如果你在栈上声明了一个 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 已实现的测试例。
这里提供一个简单的示例:

//使用默认大小创建一个 Map<K, V>,然后往其中加入一个精灵
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());
//使用一个 Map 来初始化一个 Map<K, V>
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);
    //获取所有的key,存储在 std::vector 中,用于匹配对象
    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));
    //如果 map 不为空的话,从中获取一个随机对象,否则返回一个空指针
    log("The random object tag = %d",map1.getRandomObject()->getTag());
    //find(const K& key) 可以用来在容器中根据 `key` 搜索一个元素
    //erase(const_iterator position) 可以用来通过指定迭代器删除一个元素
    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());
}
//用指定容量为5来创建一个 Map<K, V>
Map<std::string, Sprite*> map2(5);
map2.reserve(10);  //设置 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 子类对象的指针,不能是其他数据类型或者原生类型

时间: 2024-09-27 11:34:38

cocos基础教程(4)数据结构介绍之cocos2d::Map<K,V>的相关文章

cocos基础教程(4)数据结构介绍之cocos2d::Value

1.概述 cocos2d::Valie 是一个包含了很多原生类型(int,float,double,bool,unsigned char,char* 和 std::string)外加 std::vector<Value>, std::unordered_map<std::string,Value> 和 std::unordered_map<int,Value> 的类. 你可以把所有上面的提及的原生类型放入 cocos2d::Value 对象中,然后将它们转化为对应的原生

cocos基础教程(4)数据结构介绍之cocos2d::Vector

cocos2d::Vector cocos2d::Vector<T>是一个封装好的能动态增长顺序访问的容器.cocos2d::Vector<T>中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容器std::vector. T - 元素类型 T的类型必须是继承自cocos2d::Object类型的指针.因为已经将Cocos2d-x的内存管理模型集成到了cocos2d::Vector<T>中,所以类型参数不能是其他的类型包括基本类型. 注意:使用现代的c+

Cocos2d-x3.0模版容器详解之——cocos2d::Vector&lt;T&gt;, cocos2d::Map&lt;K,V&gt;, cocos2d::Value

Cocos2d-x3.0模版容器详解之一:cocos2d::Vector<T>  http://www.cocoachina.com/bbs/read.php?tid=199793Cocos2d-x3.0模版容器详解之二:cocos2d::Map<K,V>  http://www.cocoachina.com/bbs/read.php?tid=199916Cocos2d-x3.0模版容器详解之三:cocos2d::Value  http://www.cocoachina.com/b

cocos基础教程(1)Mac环境下搭建

下面主要介绍cocos2d-x环境的设置以及android的环境搭建 1.下载cocos2d-x 3.0正式版      http://www.cocos2d-x.org/download 2.下载android的sdk以及ndk     http://developer.android.com/sdk/index.html 3.下载ant     http://ant.apache.org (注:cocos2d-x的环境变量配置需要用到ant,主要是android需要使用到它) 4.下载pyt

Numpy基础教程之概念介绍

https://blog.csdn.net/chaipp0607/article/details/74566340 Numpy是应用Python进行科学计算时的基础模块.它是一个提供多维数组对象的Python库,除此之外,还包含了多种衍生的对象(比如掩码式数组(masked arrays)或矩阵)以及一系列的为快速计算数组而生的例程,包括数学运算,逻辑运算,形状操作,排序,选择,I/O,离散傅里叶变换,基本线性代数,基本统计运算,随机模拟等等. Numpy库中最核心的部分是ndarray 对象.

cocos基础教程(10)纹理缓存技术

Cocos2d通过调用CCTextureCache或者CCSpriteFrameCache来缓存精灵的纹理. 当这个精灵调用CCTextureCache 或 CCSpriteFrameCache的方法的时候,cocos2dx将使用纹理缓存来创建一个CCSprite.所以你可以预先将纹理加载到缓存中,这样你在场景中使用的时候就非常方便了.怎么样加载这些纹理就看你自己的想法.例如,你可以选择异步加载方式,这样你就可以为loading场景增加一个进度条. 当你创建一个精灵,你一般会使用CCSprite

cocos基础教程(9)声音和音效

使用音效引擎 我们可以使用Cocos2d-x自带的CocosDension库来使用声音引擎.CocosDesion实现了简单易用的SimpleAudioEngine类,为了使用它,我们只需引入他的头文件即可: #include "SimpleAudioEngine.h" 支持平台与格式 CocosDesion支持的音乐格式如下: 平台 支持的常见文件格式 备注 Android mp3, mid, oggg, wav 可以播放android.media.MediaPlayer所支持的所有

cocos基础教程(8)粒子效果

简介 粒子系统是指计算机图形学中模拟特定现象的技术,它在模仿自然现象.物理现象及空间扭曲上具备得天独厚的优势,为我们实现一些真实自然而又带有随机性的特效(如爆炸.烟花.水流)提供了方便. 粒子属性 一个强大的粒子系统它必然具备了多种多样的属性,这样才能配置出多样的粒子.下面就来看看粒子系统的主要属性吧. 主要属性: _duration 发射器生存时间,即它可以发射粒子的时间,注意这个时间和粒子生存时间不同.单位秒,-1表示永远:粒子发射结束后可点击工具栏的播放按钮再次发射 _emissionRa

cocos基础教程(12)点击交互的三种处理

1.概述 游戏也好,程序也好,只有能与用户交互才有意义.手机上的交互大致可以分为两部分:点击和输入.其中点击更为重要,几乎是游戏中全部的交互.在Cocos2d-x 3.0中,更改了dispatch机制.同时加入了两种新的交互形式:listener 和touchEvent回调.加上先前版本中的点击函数回调,与重写layer层的touch消息响应,构成了一个相对完整的交互模式. 2.三种点击 1.函数回调 函数回调是最简单的响应形式,一直以来被用于MenuItem中的点击处理.在新版本中,此处发生了