【玩转cocos2d-x之二十六】数据结构CCDictionary

【玩转cocos2d-x之二十六】数据结构CCDictionary,第1张

概述原创作品,转载请标明:http://www.voidcn.com/article/p-azlvldlh-ep.html CCDictionary在cocos2d-x中被大量的应用,比如CCTexureCache,CCSpriteFramCache等等。 1.实现原理 1.1.uthash CCDictionary是使用uthash实现的,而过时的CCMutableDictionary则是使用STL

原创作品,转载请标明:http://www.jb51.cc/article/p-azlvldlh-ep.html


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就只支持整型和字符串型了。

[cpp] view plain copy enumCCDictType { kCCDictUnkNown=0, kCCDictStr, kCCDictInt };


2.CCDictElement

在了解CCDictionary之前还要看一下CCDictElement,很明显,CCDictElement是CCDictionary的一个元素,包含了一个key-value。key支持整型和字符串,使用的时候要注意在同一个CCDictionary中key类型必须要一致,value可以不一致。


3.API
3.1.创建

copy //创建一个CCDictionary staticCCDictionary*create(); //用一个已存在的CCDictionary来创建一个新的CCDictionary staticCCDictionary*createWithDictionary(CCDictionary*srcDict); //用一个pList来创建CCDictionary staticCCDictionary*createWithContentsOffile(constchar*pfilename); //返回一个非autorelease对象的CCDictionary,它讷讷感够确保在新线程中使用 //但是你必须手动管理它的生命周期,当你不再需要它的时候,必须调用CC_SAFE_RELEASE staticCCDictionary*createWithContentsOffileThreadSafe(char*pfilename); 3.2.查找

copy //返回指定字符串类型key的value,如果CCDictionary的key是整型,会出现断言 CCObject*objectForKey(conststd::string&key); //返回指定整型key的value,如果CCDictionary的key是字符串型,会出现断言 CCObject*objectForKey(intptr_tkey); //返回指定字符串类型key的CCString,这里假定value是CCString型,如果不是或者未找到,则返回空串 constCCString*valueForKey(//返回指定整型类型key的CCString,这里假定value是CCString型,如果不是或者未找到,则返回空串 constCCString*valueForKey(intptr_tkey); 3.3.增加

copy //插入一个key-value,如果是第一次调用,那么CCDictionary的key类型会被确定为字符串型,之后就不能插入整型key //如果已存在该key,则旧key-value会被释放和移除,被新的替代 voIDsetobject(CCObject*pObject,conststd::string&key); //插入一个key-value,如果是第一次调用,那么CCDictionary的key类型会被确定为整型,之后就不能插入字符串型key //如果已存在该key,则旧key-value会被释放和移除,被新的替代 intptr_tkey); 3.4.移除

copy //移除指定key voIDremoveObjectForKey(voIDremoveObjectForKey(intptr_tkey); //移除一个CCArray中keys voIDremoveObjectsForKeys(CCArray*pKeyArray); //通过元素来移除value voIDremoveObjectForElememt(CCDictElement*pElement); //移除所有的key-value voIDremoveAllObjects(); 3.5.其他

copy //返回一个随机元素,这个使用得注意,因为value可以不一样,所以返回类型每次都可能不同,在类型转换的时候要非常小心 CCObject*randomObject(); //返回一个包含所有key的CCArray CCArray*allKeys(); //返回指定value的所有key,因为value是可以相同的,内部使用==比较两个value是否相同 CCArray*allKeysForObject(CCObject*object); //返回元素个数 unsignedintcount(); //把CCDictionary写到一个pList中,写入的value要求是字符串型 boolwritetofile(char*fullPath);
4.示例

copy //Createadictionary,returnanautoreleaSEObject. CCDictionary*pDict=CCDictionary::create(); //Insertobjectstodictionary 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"); //Gettheobjectforkey 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("{randomkey:%s}",pStr3->getCString());//如果返回的是整型pValue3,那么会出现断言 if(pDict->writetofile("pdic.pList"))//整型的value无法写入,会提示ThistypecannotappearinpropertyList cclog("Writetofilesuccess!"); Resource/pdic.pList

[HTML] copy <?xmlversion="1.0"enCoding="UTF-8"?> <!DOCTYPEpListPUBliC"-//Apple//DTDPList1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd"/> <pListversion="1.0"> dict> key>key1</string>100>key2>120>key3><!key3对应整型数据无法写入pList>
5.CCDICT_FOREACH


5.1.概况

宏定义,用于遍历CCDictionary的value。

copy #defineCCDICT_FOREACH(__dict__,__el__)\ CCDictElement*pTmp##__dict__##__el__=NulL;\ if(__dict__)\ HASH_ITER(hh,(__dict__)->m_pElements,__el__,pTmp##__dict__##__el__) 5.2.示例

copy CCDictElement*pElement; CCDICT_FOREACH(dict,pElement) { char*key=pElement->getStrKey(); //YoucertainlykNowthetypeofvalue,soweassumethatit'saCCSprite. CCSprite*pSprite=(CCSprite*)pElement->getobject(); //...... } 总结

以上是内存溢出为你收集整理的【玩转cocos2d-x之二十六】数据结构CCDictionary全部内容,希望文章能够帮你解决【玩转cocos2d-x之二十六】数据结构CCDictionary所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1065422.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存