当前位置:K88软件开发文章中心编程语言APP编程CrossApp → 文章内容

CAVector、CAList、CADeque、CAMap(数据容器)

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-23 13:51:33

由 ?﹏???ζ???﹏﹏? 创建, 最后一次修改 2016-08-27 CAVector、CAList、CADeque、CAMap 对应C++中的STL提供的vector、list、deque、map使用方式一致,但是CAVector、CAList、CADeque、CAMap添加和移除元素时,遵循CrossApp的内存管理原则,分别在添加元素的时候Object的引用计数+1,移除的时候Object的引用计数-1.我们看看C++中他们的描述与不同。c++标准库中,容器vector和list都可以用来存放一组类型相同的数据。而且二者不同于数组的一点是,支持动态增长。但它们还是有有几点不同(1)  vector是顺序表,表示的是一块连续的内存,元素被顺序存储;list是双向连接表,在内存中不一定连续。(2)当数值内存不够时,vector会重新申请一块足够大的连续内存,把原来的数据拷贝到新的内存里面;list因为不用考虑内存的连续,因此新增开销比vector小。(3)list只能通过指针访问元素,随机访问元素的效率特别低,在需要频繁随机存取元素时,使用vector更加合适。(4)当向vector插入或者删除一个元素时,需要复制移动待插入元素右边的所有元素;因此在有频繁插入删除操作时,使用list更加合适。我再来看看对deque对描述  deque是双向开口的连续性存储空间。虽说是连续性存储空间,但这种连续性只是表面上的,实际上它的内存是动态分配的,它在堆上分配了一块一块的动态储存区,每一块动态存储去本身是连续的,deque自身的机制把这一块一块的存储区虚拟地连在一起。    它首次插入一个元素,默认会动态分配512字节空间,当这512字节空间用完后,它会再动态分配自己另外的512字节空间,然后虚拟地连在一起。deque的这种设计使得它具有比vector复杂得多的架构、算法和迭代器设计。它的性能损失比之vector,是几个数量级的差别。所以说,deque要慎用。C++中map容器提供一个键值对容器,map只允许一个键对一个值。CrossApp设计它们时也遵循类似的设计原则,所以我们使用起来也是类似的用法。我们对数据容器的操作一般为:增、删、查、遍历我们这里分别对CAVector、CAList、CADeque、CAMap的常用函数进行说明:CAVector<CAObject*> ca_vector;//增ca_vector.insert(size_t index, CrossApp::CAObject *object);//插入一个元素到指定位置ca_vector.pushBack(CrossApp::CAObject *object);//在list末尾插入一个元素 //删ca_vector.erase(ca_vector.begin());//删除指定位置的元素ca_vector.erase(ca_vector.begin(),ca_vector.end());//删除指定范围的元素ca_vector.popBack();//删除最后一个元素ca_vector.clear();//删除所有元素 //查ca_vector.empty();//是否含有元素ca_vector.size();//返回vector中的元素个数ca_vector.end();//返回末尾的迭代器ca_vector.begin();//返回指向第一个元素的迭代器ca_vector.front();//返回第一个元素ca_vector.back();//返回最后一个元素 //遍历for (int i = 0; i < ca_vector.size(); i++) { CAObject* obj = ca_vector.at(i);}CAList<CAObject*> ca_list;//增ca_list.insert(size_t index, CrossApp::CAObject *object);//插入一个元素到指定位置ca_list.pushBack(CrossApp::CAObject *object);//在list末尾插入一个元素ca_list.pushFront(CrossApp::CAObject *object);//在list头部添加一个元素//删ca_list.erase(ca_list.begin());//删除指定位置的元素ca_list.erase(ca_list.begin(),ca_list.end());//删除指定范围的元素ca_list.popBack();//删除最后一个元素ca_list.popFront();//删除第一个元素ca_list.clear();//删除所有元素//查ca_list.size();//返回list中的元素个数ca_list.begin();//返回指向第一个元素的迭代器ca_list.end();//返回末尾的迭代器ca_list.front();//返回第一个元素ca_list.back();//返回最后一个元素//遍历std::list<CAObject*>::iterator it;for (it = ca_list.begin(); it != ca_list.end(); it++) { CAObject* obj = (CAObject*)*it;}CADeque<CAObject*> ca_deque;//增ca_deque.insert(size_t index, CrossApp::CAObject *object);//插入一个元素到指定位置ca_deque.pushBack(CrossApp::CAObject *object);//在list末尾插入一个元素ca_deque.pushFront(CrossApp::CAObject *object);//在list头部添加一个元素 //删ca_deque.erase(size_t index);//删除指定位置的元素ca_deque.erase(ca_deque.begin()+1, ca_deque.end()-2);//删除指定范围的元素ca_deque.popBack();//删除最后一个元素ca_deque.popFront();//删除第一个元素ca_deque.clear();//删除所有元素 //查ca_deque.size();//返回deque中的元素个数ca_deque.begin();//返回指向第一个元素的迭代器ca_deque.end();//返回末尾的迭代器ca_deque.front();//返回第一个元素ca_deque.back();//返回最后一个元素ca_deque.at(size_t index);//返指定位置的元素 //遍历for (int i = 0; i < ca_deque.size(); i++) { CAObject* obj = ca_deque.at(i);}CAMap<int, CAObject*> ca_map;//增ca_map.insert(int key, CrossApp::CAObject *object);//增加一个元素键值对 //删ca_map.erase(int key);//通过key删除元素ca_map.clear();//删除所有元素 //查ca_map.empty();//判断mpa是否是空ca_map.contains(int key);//是否有这个key返回boolca_map.getValue(int key);//根据key返回对应的Valuestd::vector<int> vec = ca_map.getKeys();//返回包含所有key的vector //遍历std::map<int, CAObject*>::iterator it;for (it = ca_map.begin(); it != ca_map.end(); ++it) { int key = it->first; CAObject* obj = it->second;}我们以CAVector为例子做一个内存管理的实验,看在添加和移除元素时,CAObject的引用计数是否发生了变化。CAObject* obj = new CAObject(); CAVector<CAObject*> ca_vector; //打印引用计数CCLog("count:%d",obj->retainCount()); //把obj添加到vector尾部ca_vector.pushBack(obj); //打印引用计数CCLog("count:%d",obj->retainCount()); //把obj移除ca_vector.eraseObject(obj); //打印引用计数CCLog("count:%d",obj->retainCount());

CAVector、CAList、CADeque、CAMap(数据容器)