Cocos2dx游戏教程(十九):容器Value,Vector,Map

本文深入解析Cocos2dx3.x中的三种核心容器:Value、Vector和Map。Value作为模板容器类,实现了对多种数据类型的封装,便于数据转换;Vector提供动态增长的顺序访问容器,基于std::vector实现;Map则是存储键值对的关联式容器,支持快速检索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一节提到了缓存的相关容器,那么下面具体介绍下cocos2dx 3.x中的容器类型吧

一、Value

Value是什么?初次看到不禁会产生疑问。源码是最好的老师,我们来看一下它具体做了什么吧。

文件所在位置: cocos2d-x-XXX/cocos/base/CCValue.h

打开后我们可以看到如下的定义

class CC_DLL Value
{
public:
    //一个预定义的空值,暂时还不知道其作用
    static const Value Null;

   //枚举类,封装所有的数据类型名
    enum class Type
    {
        /// no value is wrapped, an empty Value
        NONE = 0,
        /// wrap byte
        BYTE,
        /// wrap integer
        INTEGER,
        /// wrap unsigned
        UNSIGNED,
        /// wrap float
        FLOAT,
        /// wrap double
        DOUBLE,
        /// wrap bool
        BOOLEAN,
        /// wrap string
        STRING,
        /// wrap vector
        VECTOR,
        /// wrap ValueMap
        MAP,
        /// wrap ValueMapIntKey
        INT_KEY_MAP
    };

private:
    //用共用体封装多种数据类型 保存Value的值,极大的节省了空间    
    union
    {
        unsigned char byteVal;
        int intVal;
        unsigned int unsignedVal;
        float floatVal;
        double doubleVal;
        bool boolVal;

        std::string* strVal;
        ValueVector* vectorVal;
        ValueMap* mapVal;
        ValueMapIntKey* intKeyMapVal;
    }_field;

    //记录当前Value内保存的数据类型
    Type _type;
}

cocos2d::Value是一个模板容器类,完成了对很多数据类型的封装。如原生类型int, float, char, char*, bool,以及string,map,vector等stl模板类。
Value极大的方便了cocos2dx工程里各种数据类型之间的转换。我们可以很同意的将不同数据类型转换为Value,反之亦然。

我么可以直接使用Value的构造函数,传入任意支持的类型,都会正确构造出想要的对象,而且还提供了整数、浮点型和字符串之间的转换,如
整型转为字符串: std::string str = “NO”+Value(1).asString();
字符串转为整型:log("%d",Value(“1234”).asInt())
浮点型转字符串:log("%s",Value(123.5f).asString().c_str())
字符串转浮点型:log("%f",Value(“14.45”).asFloat())

二、Vector

std::vector大家应该都比较熟悉了,那么Cocos2d::Vector是什么呢?

Vector是一个封装好的能动态增长顺序訪问的容器。它的低层实现数据结构是标准模版库中的标准顺序容器std::vector。

主要使用的函数说明:
size():Vector大小
at(index):返回Vector下标为index的对象
pushBack(object):在Vector的最后加入一个object对象
eraseObject(object):从Vector中移除object对象
erase(index):从Vector中移除下标为index的对象
clear():清空Vector

怎样遍历Vector

for(auto obj : vector){
}

是不是就明白啦~~~

三、Map

Map是一个存储键值对的关联式容器,它能够通过它们的键高速检索相应的值。和std::map很类似哦~~
主要函数:
insert(key,value):向Map中插入一个对象。
at(key):返回Map中keyword为key的对象
怎样遍历Map?

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));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值