STL序列式容器之vector

来源:互联网 发布:js set time out停止 编辑:程序博客网 时间:2024/05/16 14:08

首先我们需要对STL的容器有一个宏观的概念,然后在仔细讨论vector。

STL容器分为两类:分别是序列式容器和关联式容器。

序列式容器:

vector, heap, priority_queue, list, slist, deque, stack, queue.

需要说明的是,heap内含一个vector,priority_queue内含一个heap,stack内含一个deque,queue内含一个deque,这样的关系实际上是将vector或者deque改头换面而成,因此deque,stack等也常称为配接器。

关联式容器:

set,map,multiset,multimap,他们的基础都是红黑色。

未标准化的:hash_set, hast_map, hash_multiset, hash_multimap, 他们的基础是hashtable,即哈希表。


下面我们详细学习一下vector。

vector的实现技术关键在于对大小的控制以及重新配置时的数据移动效率。

重新配置需要三个阶段:配置新空间-》数据移动-》释放旧空间

1、vector的迭代器

由于vector和数组相似都是维护一段连续的内存空间,因此可以支持随机访问,因此vector的迭代器是随机存取迭代器。

2、vector的数据结构

vector需要3个迭代器来维护,分别是start,finish以及end_of_storage。为了理解这三个迭代器的作用,就需要明白向量大小和容量的关系,容量永远要大于或者等于向量大小。(size()和capacity())注意finish和end_of_storage都是指向最后一个元素的下一个位置,有了这些就很容易求得向量的大小和容量。

3、vector的内存管理

vector采用的动态增加大小,并不是在原空间之后连接新空间(因为无法保证原空间之后还有可以的新空间),而是以原大小的两倍配置一块新的空间,然后拷贝数据,并在拷贝完原内容之后构造新元素,并释放新空间。因此,对vector的任何操作,一旦引起空间重新配置,指向原vector的迭代器将失效,这是我们很容易犯的一个错误。



0 0
原创粉丝点击