数据结构CCDictionary
来源:互联网 发布:java软件编程培训费用 编辑:程序博客网 时间:2024/05/16 02:16
CCDictionary在cocos2d-x中被大量的应用,比如CCTexureCache,CCSpriteFramCache等等。
1.实现原理
1.1.uthash
CCDictionary是使用uthash实现的,而过时的CCMutableDictionary则是使用STL实现,就效率而言CCDictionary至少提升了两倍,而且CCDictionary并没有使用C++模版,因此也很容易绑定到脚本。
uthash是一个C/C++的哈希表实现,它以宏定义的方式实现了哈希表,不仅加快了运行速度,而且与key类型无关。它的github地址是https://github.com/troydhanson/uthash。cocos2d-x的头文件在\cocos2d-x-2.2.0\cocos2dx\support\data_support\uthash.h。
如果想在C++中直接使用也很简单,userguide在这里:http://troydhanson.github.io/uthash/userguide.html。可以很方便地进行增加,删除,查找,计数,迭代,排序等操作。
1.2.键(key)
uthash支持4种标准类型的键:整型,字符串,指针和结构体,不过到了CCDictionary就只支持整型和字符串型了。
enum CCDictType { kCCDictUnknown = 0, kCCDictStr, kCCDictInt };
2.CCDictElement
在了解CCDictionary之前还要看一下CCDictElement,很明显,CCDictElement是CCDictionary的一个元素,包含了一个key-value。key支持整型和字符串,使用的时候要注意在同一个CCDictionary中key类型必须要一致,value可以不一致。
3.API
1.创建
//创建一个CCDictionary static CCDictionary* create(); //用一个已存在的CCDictionary来创建一个新的CCDictionary static CCDictionary* createWithDictionary(CCDictionary* srcDict); //用一个plist来创建CCDictionary static CCDictionary* createWithContentsOfFile(const char *pFileName); //返回一个非autorelease对象的CCDictionary,它讷讷感够确保在新线程中使用 //但是你必须手动管理它的生命周期,当你不再需要它的时候,必须调用CC_SAFE_RELEASE static CCDictionary* createWithContentsOfFileThreadSafe(const char *pFileName);
3.2.查找
/插入一个key-value,如果是第一次调用,那么CCDictionary的key类型会被确定为字符串型,之后就不能插入整型key //如果已存在该key,则旧key-value会被释放和移除,被新的替代 void setObject(CCObject* pObject, const std::string& key); //插入一个key-value,如果是第一次调用,那么CCDictionary的key类型会被确定为整型,之后就不能插入字符串型key //如果已存在该key,则旧key-value会被释放和移除,被新的替代 void setObject(CCObject* pObject, intptr_t key);
3.4.移除
//移除指定key void removeObjectForKey(const std::string& key); void removeObjectForKey(intptr_t key); //移除一个CCArray中keys void removeObjectsForKeys(CCArray* pKeyArray); //通过元素来移除value void removeObjectForElememt(CCDictElement* pElement); //移除所有的key-value void removeAllObjects();
3.5.其他
//返回一个随机元素,这个使用得注意,因为value可以不一样,所以返回类型每次都可能不同,在类型转换的时候要非常小心 CCObject* randomObject(); //返回一个包含所有key的CCArray CCArray* allKeys(); //返回指定value的所有key,因为value是可以相同的,内部使用==比较两个value是否相同 CCArray* allKeysForObject(CCObject* object); //返回元素个数 unsigned int count(); //把CCDictionary写到一个plist中,写入的value要求是字符串型 bool writeToFile(const char *fullPath);
4.示例
// Create a dictionary, return an autorelease object. CCDictionary* pDict = CCDictionary::create(); // Insert objects to dictionary 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"); // Get the object for key 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());//这里有问题了,因为value有不同类型,所以随机返回时类型处理要小心 CCLog("{ random key: %s }",pStr3->getCString()); //如果返回的是整型pValue3,那么会出现断言 if(pDict->writeToFile("pdic.plist")) //整型的value无法写入,会提示This type cannot appear in property list CCLog("Write to file success!");Resource/pdic.plist
<?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>
5.CCDICT_FOREACH
.1.概况
宏定义,用于遍历CCDictionary的value。
#define CCDICT_FOREACH(__dict__, __el__) \ CCDictElement* pTmp##__dict__##__el__ = NULL; \ if (__dict__) \ HASH_ITER(hh, (__dict__)->m_pElements, __el__, pTmp##__dict__##__el__)
5.2.示例
CCDictElement* pElement; CCDICT_FOREACH(dict, pElement) { const char*key = pElement->getStrKey(); // You certainly know the type of value, so we assume that it's a CCSprite. CCSprite* pSprite = (CCSprite*)pElement->getObject(); // ...... }
- 数据结构CCDictionary
- CCDictionary
- CCDictionary
- CCDictionary
- 【玩转cocos2d-x之二十六】数据结构CCDictionary
- 【玩转cocos2d-x之二十六】数据结构CCDictionary
- 【玩转cocos2d-x之二十六】数据结构CCDictionary
- CCDictionary(转)
- CCDictionary详解
- CCDictionary 遍历
- CCDictionary详解
- cocos2d CCDictionary
- CCDictionary 应用
- JSB CCDictionary CCDictionary to JSB CCDictionary绑定jsb plist file
- CCDictionary 解析xml总结
- CCDictionary文件读取
- CCDictionary文件读取
- CCDictionary 解析xml总结
- 让powershell在不显示提示信息的情况下通过Internet上下载的ps脚本
- x264 - x264_me_search_ref
- ACM抽象基类
- Androidの共享登录之方案研究
- Android 怎么退出整个应用程序?
- 数据结构CCDictionary
- 幸运大转盘-jQuery+PHP实现的抽奖程序
- JS操作JSON读书笔记
- DSP/BIOS 常用API总结
- C++ 堆和栈的比较
- 解决getOutputStream() has already been called for this response
- Tokyo Cabinet vs Redis
- destoon URL Rewrite(伪静态)设置方法
- Firebird常用系统表Sql语句