老外用网页设计软件wordpress sharp,seo优化网站教程,asp公司网站,预约网站模板STL是C/C开发中一个非常重要的模板#xff0c;而其中定义的各种容器也是非常方便我们大家使用。下面#xff0c;我们就浅谈某些常用的容器。这里我们不涉及容器的基本操作之类#xff0c;只是要讨论一下各个容器其各自的特点。STL中的常用容器包括#xff1a;顺序性容器开发中一个非常重要的模板而其中定义的各种容器也是非常方便我们大家使用。下面我们就浅谈某些常用的容器。这里我们不涉及容器的基本操作之类只是要讨论一下各个容器其各自的特点。STL中的常用容器包括顺序性容器vector、deque、list、关联容器map、set、容器适配器queue、stac。 1、顺序性容器 1vector vector是一种动态数组在内存中具有连续的存储空间支持快速随机访问。由于具有连续的存储空间所以在插入和删除操作方面效率比较慢。vector有多个构造函数默认的构造函数是构造一个初始长度为0的内存空间且分配的内存空间是以2的倍数动态增长的即内存空间增长是按照20,21,22,23.....增长的在push_back的过程中若发现分配的内存空间不足则重新分配一段连续的内存空间其大小是现在连续空间的2倍再将原先空间中的元素复制到新的空间中性能消耗比较大尤其是当元素是非内部数据时(非内部数据往往构造及拷贝构造函数相当复杂)。vector的另一个常见的问题就是clear操作。clear函数只是把vector的size清为零但vector中的元素在内存中并没有消除所以在使用vector的过程中会发现内存消耗会越来越多导致内存泄露现在经常用的方法是swap函数来进行解决 vectorint V; V.push_back(1); V.push_back(2);V.push_back(1); V.push_back(2); vectorint().swap(V); 或者 V.swap(vectorint()); 利用swap函数和临时对象交换使V对象的内存为临时对象的内存而临时对象的内存为V对象的内存。交换以后临时对象消失释放内存。 2deque deque和vector类似支持快速随机访问。二者最大的区别在于vector只能在末端插入数据而deque支持双端插入数据。deque的内存空间分布是小片的连续小片间用链表相连实际上内部有一个map的指针。deque空间的重新分配要比vector快重新分配空间后原有的元素是不需要拷贝的。 3list list是一个双向链表因此它的内存空间是可以不连续的通过指针来进行数据的访问这使list的随机存储变得非常低效因此list没有提供[]操作符的重载。但list可以很好地支持任意地方的插入和删除只需移动相应的指针即可。 4在实际使用时如何选择这三个容器中哪一个应根据你的需要而定一般应遵循下面的原则 1) 如果你需要高效的随即存取而不在乎插入和删除的效率使用vector 2) 如果你需要大量的插入和删除而不关心随即存取则应使用list 3) 如果你需要随即存取而且关心两端数据的插入和删除则应使用deque 2、关联容器 1map map是一种关联容器该容器用唯一的关键字来映射相应的值即具有key-value功能。map内部自建一棵红黑树一种自平衡二叉树这棵树具有数据自动排序的功能所以在map内部所有的数据都是有序的以二叉树的形式进行组织。这是map的模板 template class Key, class T, class Compare lessKey, class Allocatorallocator pairconst Key,T class map; 从模板中我们可以看出再构造map时是按照一定的顺序进行的。map的插入和删除效率比其他序列的容器高因为对关联容器来说不需要做内存的拷贝和移动只是指针的移动。由于map的每个数据对应红黑树上的一个节点这个节点在不保存你的数据时是占用16个字节的一个父节点指针左右孩子指针还有一个枚举值标示红黑色所以map的其中的一个缺点就是比较占用内存空间。 2set set也是一种关联性容器它同map一样底层使用红黑树实现插入删除操作时仅仅移动指针即可不涉及内存的移动和拷贝所以效率比较高。set中的元素都是唯一的而且默认情况下会对元素进行升序排列。所以在set中不能直接改变元素值因为那样会打乱原本正确的顺序要改变元素值必须先删除旧元素再插入新元素。不提供直接存取元素的任何操作函数只能通过迭代器进行间接存取。set模板原型 template class Key, class CompareclassKey, class AllocSTL_DEFAULT_ALLOCATOR(Key) class set; set支持集合的交(set_intersection)、差(set_difference)、并(set_union)及对称差(set_symmetric_difference) 等一些集合上的操作。 3、容器适配器 1queue queue是一个队列实现先进先出功能queue不是标准的STL容器却以标准的STL容器为基础。queue是在deque的基础上封装的。之所以选择deque而不选择vector是因为deque在删除元素的时候释放空间同时在重新申请空间的时候无需拷贝所有元素。其模板为 template TYPENAME _Sequencedeque_TP typeneam _Tp, class queue; 2stack stack是实现先进后出的功能和queue一样也是内部封装了deque这也是为啥称为容器适配器的原因吧纯属猜测。自己不直接维护被控序列的模板类而是它存储的容器对象来为它实现所有的功能。stack的源代码原理和实现方式均跟queue相同。