顺序容器
顺序容器类型 | 特点 | ||
---|---|---|---|
vector | 可变大小数组 | 支持快速随机访问。因为元素保存在连续的内存空间里 | 中间位置添加删除元素很慢。在尾部插入删除速度快。因为要移动插入/删除位置之后的所有元素 |
string | 专用于保存字符(与vector相似) | 支持随机访问 | 中间位置添加删除元素很慢。在尾部插入删除速度快 |
deque | 双端队列 | 支持快速随机访问 | 在头尾位置插入/删除速度很快 |
list | 双向链表 | 不支持随机访问。只支持双向顺序访问 | 在链表的任何位置插入和删除都很快 |
forward_list | 单向链表 | 不支持随机访问。只支持单向顺序访问 | 在链表的任何位置插入和删除都很快 |
array | 固定大小数组 | 支持快速随机访问 | 不能添加或删除元素 |
vector
vector和数组比较?
vector 和 数组 非常相似,但是两者的差别在于空间运用的灵活性。数组是静态空间
,定义好大小之后就不能改变;
但是vector是动态空间
,随着元素的加入,它的内部机制可动态的增加或减少元素,内存管理自动完成,我们也可以用reserve()来自行管理内存。
vector类有两个成员函数:capacity 和 reserve
capacity:用来获取当前容器可以存储的元素总数
reserve:用来告诉容器应该预留多少个元素的空间。
vector的两个大小概念:
capacity:在容器必须重新分配存储空间之前,当前可以存储
的元素总数。当元素个数超过capacity()的时候,就会触发内存重新分配,此时会重新分配一块更大的空间,然后复制元素到新分配的空间里去,然后再释放旧空间
size:当前容易拥有的元素个数。即已经存储
的元素个数。
size是当前已有元素大小,capacity是当前可容纳元素大小。
vector迭代器失效的情况:
vector迭代器在内存重新分配的时候将会失效(因为它指向的元素在内存分配的前后不在相同)。
插入元素后
,指向当前插入元素的后面的任何元素的迭代器都失效。当插入元素后,元素个数如果超过capacity()时,内存会重新分配,此时所有的迭代器都将失效。
删除元素时
,指向被删除元素之后的任何元素的迭代器将会失效。vector是连续存储的,在删除一个元素的时候,后面的元素都要向前移动,所以迭代器的位置就会被前面的覆盖,这个时候++迭代器的时候,就会跳过删除元素
的后一个元素。erase会返回删除之后的元素的iterator。
list
list 的内部结构是一个双向环状链表。
不能随机访问一个元素,可以双向遍历,可以动态的增加或减少元素,内存管理自动完成。
增加任何元素都不会使迭代器失效。删除元素时,除了指向当前被删除的迭代器外,其它迭代器都不会失效。
deque
deque 则是一种双开口的连续线性空间。即可以再头尾两端分别做元素的插入和删除操作。
deque 没有容量(capacity)概念,因为它是动态地以分段连续空间组合
成的,随时可以增加一段新的空间并链接起来。
随机访问每个元素,所需要的时间为常量。
在开头和末尾增加元素所需时间与元素数目无关,在中间增加或删除元素所需时间随元素数目呈线性变化。
可动态增加或减少元素,内存管理自动完成,不提供内存管理的成员函数
stack
适配器,可以将任意类型的序列容器转换为一个堆栈。
queue
适配器,可以将任意类型的序列容器转换为一个队列。
priority_queue
适配器,可以将任意类型的序列容器转换为一个优先级队列。
只能访问第一个元素,不能编译priority_queue,第一个元素始终是优先级最高的元素。
构造函数 | 作用 |
---|---|
C c | 默认构造函数,构造空容器 |
C c1(c2) | 构造c2的拷贝c1 |
C c(b,e) | 构造c,将迭代器b和e指定的范围内的元素拷贝到c(array不支持) |
C c{a,b,c…} | 列表初始化c |
(1)以vector来举个例子:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> vec1; //默认初始化,vec1为空
for(int i = 1;i <= 10;i++){
vec1.push_back(i);
}
vector<int> vec2(vec1); //使用vec1初始化vec2
vector<int> vec3(vec1.begin(),vec1.end());
vector<int> vec4(10); //10个值为0的元素
vector<int> vec5(10,4); //10个值为4的元素
cout << (vec1 == vec2) ? true : false;
cout << "\n";
cout << (vec1 == vec3) ? true : false;
return 0;
}
控制台输出:
(2)以list来举个例子
#include <iostream>
#include <list>
using namespace std;
int main(){
list<int> list1; //创建一个空的list
list<int> list2(list1); //使用list1初始化list2
list<int> list3(3