Vector

Vector是3.x系列之后提出来的新的数据结构,综合了std::vector有很多函数,可以很方便的进行很多数据操作,也融入了Cocos2d-x的内存管理。

Vector区别于普通的类型sprite等,Vector是用于存储一组数据的容器,顾名思义也就理应当管理一大块内存。比如可以将5个sprite都放入一个vector,那么vector要对这5个sprite进行内存管理,也要具备可以很方便有效的对这些数据进行插入、删除、搜索等处理。

为了实现对这5个sprite的内存管理,Vector采用了Cocos2d-X引用计数和智能指针的理念。首先,Vector本身是局部变量,不占用堆里的内存,这样Vector的生命周期受作用域的控制,在Vector的析构函数中进行内存释放,然后,传入的变量必须是Ref的子集,这样才能使用引用计数retain和release函数,在将这些变量往Vector进行操作的时候进行内存管理。比如在copy、pushBack、insert、replace的时候对元素进行retain,在popback、erase、clear、replace对元素进行release,在swap、move不对元素进行内存管理。

为了方便有效的对这些数据进行操作,Vector本身就是一个std::vector,然后包装了std::vector的begin、end、capacity、size、empty、max_size、getIndex、front、back、shrinkToFit等方法,还自己提供了一些自定义方法replace、swap、find等

map

Map类似于Vector,包装了std::unordered_map和std::map,并且也融入了Cocos2d-x的内存管理。

unordered_map是将key转化成了hash,然后按照hash的顺序来进行存储,并非按照key或者value的顺序来存储。当进行搜索的时候,将key转化成hash进行搜索,算法复杂度最快是o(1),最慢是o(n)。unordered_map的hash算法是根据一个固定值buckets来计算,所以在初期的时候会设定一个buckets值,这个值相当于reserve的capacity,如果Map中存放的元素数量超过buckets就需要重新计算hash值,所以需要根据插入元素的频繁度和数量进行权衡,决定创建的时候设定reserve的capacity。另外这个hash算法是将key转化为hash值,但如果key为int,那么用key来当作hash值。

Map和Vector的另外一个关系是:Map的value相当于Vector的元素,在内存管理的过程中Vector会将元素进行retain和release,则Map对value进行retain和release,也就是iter->second。

Value

Vector、Map都是容器,而Value相当于Int、Float、Vector等所有数据结构的包装体,所有数据都可以定义成Value类型,然后通过Value提供的方法进行数据类型转换,通过Value的析构函数来进行内存管理。

Value的构造函数传入一个参数,这个参数用于给这个Value进行赋值,并确定Value的数据类型。假如传入参数为int,那么Value就是int类型的数据,假如传入参数为std::vector,那么会new一块vector,然后赋值。然而Value是局部函数,在生命周期结束的时候,调用析构函数,将new的这一块vector进行delete。在赋值操作的时候,如果Value本身的数据类型与参数数据类型不符合,假如之前的是std::vector,新的参数为td::unordered_map。那么会先将之前的进行delete,然后new一块新的内存。如果是move操作,则只需要将先用的进行clear,然后直接将参数的move过来,再将参数的type设置为none即可。在做数据类型转换的时候,如果可以转换的就转化,如果不可以转换的就转换为0。