上一節提到了緩存的相關容器,那麼下面具體介紹下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));
}