首页 > 代码库 > STL容器

STL容器

在stl中容器分为两大类,序列式容器和关联式容器。

序列式容器:array、vector、heap、priority-queue、list、slist、deque、(stack、queue)最后两个是配接器

关联式容器:RB-tree、set、map、multiset、multimap、hashtable、hash_set、hash_map、hash_multiset、hash_multimap

1、vector

vector在数据安排和操作上和array非常相似。两者唯一的区别在于空间的运用的灵活性。array是静态空间,一旦配置了大小就不能改变了,如果要改变大小只能有客户端自己来操作。vector是动态空间,随着元素的增加,它的内部机制会自动扩充空间来容纳新的元素。在vector的实现技术中,关键在于其对大小的控制,以及重新配置时的数据移动效率。一旦vector旧的空间满载了,如果客户端每新增一个元素,vector内部只是扩充一个元素空间,那么效率并不能很好地提高,因为所谓扩充空间(无论多大),都涉及了“配置新空间、数据移动、释放旧空间”等几步,时间成本较高。vector采用的数据结构非常简单,线性连续空间。它以两个迭代器start和finish分别指向配置得来的连续空间中目前已经被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端。为了降低空间配置时的速度成本,vector实际配置的大小可能比客户端要求的量更大一些,以备将来可能的扩充。这便是容量的概念。换句话说,一个vector的容量永远大于或等于其大小。一旦容量等于大小,便是满载,下次在有新增元素,整个vector就得另觅居所。所谓动态增加大小,并不是在原空间之后接续新空间(因为无法保证原空间之后尚有可配置新空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新的元素,并释放原空间。因此vector的任何操作,一旦引起空间重新配置,指向原vector的的所有迭代器就失效了,这是程序中很容易出现的错误,务必小心。