其实最没意思的数据结构就是Map和Vector这两个了,完完全全就是std::map和std::vector上面再加了一层引用计数。当然,这也有好处,就是支持std算法以及支持Cocos2d-x的内存管理机制。
看源码可以知道(下均只对Map进行分析,Vector同理)
内部的数据结构就是一个std::unordered_map,但是Cocos2d-x对其做了一个限制,V必须是由Ref派生出来的数据类型,这样才能支持内存管理机制,下面是构造函数(有多个构造函数,只列举了一个)
static_assert是表示在编译时检查,std::is_convertible是检测V与Ref*是否是继承关系,如果是,value为true,检测通过。如果不是,会在编译期就告诉我们,这个地方编译不过。
接下来就是插入函数
/**@briefInsertsnewelementsinthemap.
*@noteIfthecontainerhasalreadycontainedthekey,thisfunctionwillerasetheoldpair(key,object)andinsertthenewpair.
*@paramkeyThekeytobeinserted.
*@paramobjectTheobjecttobeinserted.
*/
void
insert(
const
K&key,Vobject)
{
@H_404_71@CCASSERT(object!=nullptr,monospace!important; font-size:1em!important; min-height:inherit!important; color:blue!important">"Objectisnullptr!"
);
@H_404_71@erase(key);
@H_404_71@_data.insert(std::make_pair(key,object));
@H_404_71@object->retain();
值得注意的是,这里先有一个删除操作,再进行插入,这样为了保证所有的key都是唯一值,但是这样会多造成一次遍历,因为unordered_map的插入是无序的,所以unordered_map的insert操作的复杂度是O(1),但是erase的删除必须要find key,所以会有O(N)的复杂度,所以效率会比直接使用unordered_map低。 |