【玩转cocos2d-x之二十六】数据结构CCDictionary
CCDictionary在cocos2d-x中被大量的应用,比如CCTexureCache,CCSpriteFramCache等等。
实现原理 uthash CCDictionary是使用uthash实现的,而过时的CCMutableDictionary则是使用STL实现,就效率而言CCDictionary至少提升了两倍,而且CCDictionary并没有使用C++模版,因此也很容易绑定到脚本。
uthash是一个C/C++的哈希表实现,它以宏定义的方式实现了哈希表,不仅加快了运行速度,而且与key类型无关。它的github在这里 。cocos2d-x的头文件在\cocos2d-x-2.2.0\cocos2dx\support\data_support\uthash.h。
如果想在C++中直接使用也很简单,userguide在这里 。可以很方便地进行增加,删除,查找,计数,迭代,排序等操作。
键(key) uthash支持4种标准类型的键:整型,字符串,指针和结构体,不过到了CCDictionary就只支持整型和字符串型了。
CCDictType 1 2 3 4 5 6 enum CCDictType { kCCDictUnknown = 0 , kCCDictStr, kCCDictInt };
CCDictElement 在了解CCDictionary之前还要看一下CCDictElement,很明显,CCDictElement是CCDictionary的一个元素,包含了一个key-value。key支持整型和字符串,使用的时候要注意在同一个CCDictionary中key类型必须要一致,value可以不一致。
API 创建 创建 1 2 3 4 5 6 7 8 9 static CCDictionary* create () ; static CCDictionary* createWithDictionary (CCDictionary* srcDict) ; static CCDictionary* createWithContentsOfFile (const char *pFileName) ; static CCDictionary* createWithContentsOfFileThreadSafe (const char *pFileName) ;
查找 查找 1 2 3 4 5 6 7 8 CCObject* objectForKey (const std ::string & key) ; CCObject* objectForKey (intptr_t key) ; const CCString* valueForKey (const std ::string & key) ; const CCString* valueForKey (intptr_t key) ;
增加 增加 1 2 3 4 5 6 void setObject (CCObject* pObject, const std ::string & key) ; void setObject (CCObject* pObject, intptr_t key) ;
移除 移除 1 2 3 4 5 6 7 8 9 void removeObjectForKey (const std ::string & key) ; void removeObjectForKey (intptr_t key) ; void removeObjectsForKeys (CCArray* pKeyArray) ; void removeObjectForElememt (CCDictElement* pElement) ; void removeAllObjects () ;
其他 其他 1 2 3 4 5 6 7 8 9 10 CCObject* randomObject () ; CCArray* allKeys () ; CCArray* allKeysForObject (CCObject* object) ; unsigned int count () ; bool writeToFile (const char *fullPath) ;
示例 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CCDictionary* pDict = CCDictionary::create(); CCString* pValue1 = CCString::create("100" ); CCString* pValue2 = CCString::create("120" ); CCInteger* pValue3 = CCInteger::create(200 ); pDict->setObject(pValue1, "key1" ); pDict->setObject(pValue2, "key2" ); pDict->setObject(pValue3, "key3" ); CCString* pStr1 = (CCString*)pDict->objectForKey("key1" ); CCLog("{ key1: %s }" , pStr1->getCString()); CCInteger* pInteger = (CCInteger*)pDict->objectForKey("key3" ); CCLog("{ key3: %d }" , pInteger->getValue()); CCString* pStr3=static_cast <CCString*>(pDict->randomObject()); CCLog("{ random key: %s }" ,pStr3->getCString()); if (pDict->writeToFile("pdic.plist" )) CCLog("Write to file success!" );
Resource/pdic.plist
pdic.plist 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"/> <plist version ="1.0" > <dict > <key > key1</key > <string > 100</string > <key > key2</key > <string > 120</string > <key > key3</key > <!key3对应整型数据无法写入 /> </dict > </plist >
CCDICT_FOREACH 概况 宏定义,用于遍历CCDictionary的value。
CCDICT_FOREACH宏定义 1 2 3 4 #define CCDICT_FOREACH(__dict__, __el__) \ CCDictElement* pTmp##__dict__##__el__ = NULL; \ if (__dict__) \ HASH_ITER(hh, (__dict__)->m_pElements, __el__, pTmp##__dict__##__el__)
示例 CCDICT_FOREACH示例 1 2 3 4 5 6 7 8 CCDictElement* pElement; CCDICT_FOREACH(dict, pElement) { const char *key = pElement->getStrKey(); CCSprite* pSprite = (CCSprite*)pElement->getObject(); }
<
【玩转cocos2d-x之二十七】CCSequence不能执行CCRepeatForever
【玩转cocos2d-x之二十五】数据结构CCArray
>