底层数据结构:动态开辟的数组,每一次以原来空间大小的2倍进行扩容
vector<int> vec;
vec.push_back(20);//末尾添加元素,时间复杂度O(1)
vec.insert(it,20);//it迭代器指向的位置添加一个元素20,时间复杂度O(n)
//这两种增加方式会导致容器的扩容
vec.pop_back();//末尾删除元素O(1)
vec.erase(it);//删除迭代器指向的元素O(n)
operator[]//下标随机访问·O(1)
iterator迭代器进行遍历
find,for_each
foreach =也是通过迭代器来实现的
注意:对容器进行连续插入或者删除操作(insert/erase)一定要更新迭代器,否则第一次insert/erase后,迭代器就会失效
size()
empty()
reserver(20); :vector预留空间的,只给容器底层开辟指定大小的内存空间,并不会添加新的元素
resize(20):容器扩容,不仅给容器开辟指定的大小内存空间,还会添加新的元素
swap:两个容器进行元素交换
底层数据结构是动态开辟的二维数组 一维数组从2开始,以2倍的方式进行扩容,每次扩容后,原来第二维的数组从新的第一维数组下标oldsize/2开始存放,上下都预留相同的空行,方便支持deque的首尾元素添加
deque<int> que;
que.push_back(20);//从末尾添加元素 O(1)
que.push_front(20);//从首部添加元素O(1)
que.insert(it,20);//it指定的位置添加元素
由于deque的第二维内存空间不是连续的,所以在deque中间进行元素的insert或者erase,造成元素移动的时候比vector要慢。
que.pop_back();//从末尾删除元素O(1)
que.pop_front();//从首部删除元素O(1)
que.erase(it);//从it指向的位置删除元素O(n)
iterator(连续的insert/erase一定要考虑迭代器失效问题)
底层数据结构:双向的循环链表 pre data next
list<int>mylist;
mylist.push_back(20);//从末尾添加元素O(1)
mylist.push_front(2);//从首部添加元素O(1)
mylist.insert(it,20);//it指向的位置添加元素O(1),链表中进行insert时先要进行一个query查询操作,对于链表来说,查询的操作效率就比较慢了。
mylist.pop_back(20);//从末尾删除元素O(1)
mylist.pop_front(2);//从首部删除元素O(1)
mylist.erase(it,20);//it指向的位置删除元素O(1),
iterator连续的inseert和erase一定要考虑迭代器失效问题
deque和list,比vector容器多出来了增加删除函数的接口:push_front ,pop_front
vector和deque之间的区别?
priority_queue: push 入队 pop出队 top查看队顶元素 empty判断队空 size返回元素个数 底层默认的数据结构是:大根堆
priority_queue依赖于vector。为什么呢? 底层默认把数据组成一个大根堆结构,在一个内存连续的数组上构建一个大根堆或者小根堆的(按照编号存储),分段的内存空间存储(编号重复)就没有意义了。