STL标准模板库学习
deque容器
- deque容器简介
- deque时双端数组,而vector是单端数组;
- deque在接口上和vector非常相似,在许多操作的地方可以直接替换;
- deque可以随机存取元素(支持索引值直接存取,用[]操作符或at()方法);
- deque在头部和尾部插入删除元素的速度非常快(时间复杂度为O(1) ),但是在中间的执行效率慢(时间复杂度为O(n));
#include <deque>
;
- deque容器的操作
- deque容器的操作和vector基本一致:
deque.push_front(elem);
//在头部插入元素deque.pop_front();
//删除头部第一个元素
list容器(链表)
- list容器简介
- list是一个双向链表容器,可高效地进行插入和删除操作;
- list不可以随机存取元素,所以不支持at()和[]下标索引操作;
- 插入和删除的时间复杂度为O(1),但是查找的时间复杂度为O(1);
#include <list>
;
- list对象的默认构造和带参数的构造函数
- 采用模板类实现,对象的默认构造形式:
list<T> lst;
:
list<int> lstInt;
list<float> lstF;
- 带参数的构造函数和vector容器基本一致。
- list头部尾部插入删除元素
因为list容器和deque容器一样是双端容器,因此在头部尾部插入删除元素的函数调用一致。
lst.front();
返回双端链表的第一个结点;lst.back();
返回双端链表的最后一个结点;- 不仅可以返回第一个结点和最后一个结点的值,还可以返回对象,并进行赋值;
int front = lstInt.front();
int back = lstInt.back();
cout<<"front:"<<front<<" "<<"back:"<<back<<endl;
lstInt.front() = 1111;
lstInt.back() = 999;
cout<<"front:"<<lstInt.front()<<" "<<"back:"<<lstInt.back()<<endl;
- list容器的迭代器
- list容器的迭代器是一个“双向迭代器”:双向迭代器从两个方向读写容器。除了提供前向迭代器的全部操作外,还提供前置和后置的自减运算。
list.begin();
返回正向的第一个结点的迭代器;list.end();
返回正向最后一个结点的后一个位置的迭代器;list.rbegin();
返回反向即倒数第一个结点的迭代器;list.rend();
返回反向倒数最后一个结点的后一个位置的迭代器;- list容器的迭代器没有重载’+'运算符,不能执行
+n
操作,只能执行++
和--
操作;
-
list的赋值
理论知识:list.assign(beg, end);
:将beg到end区间的数据拷贝到vector(左闭右开)。list.assign(n,elem);
:将n个elem拷贝赋值给本身。list& operator=(const vector &vec);
:重载等号操作符。list.swap(vec);
:将vec与本身的元素互换。
-
list的大小
理论知识:list.size();
:返回容器中元素的个数。list.empty();
:判断容器内是否为空,返回值为布尔类型。list.resize(num);
:重新指定大小,若容器变大,则以默认值(0)填充新位置,若变小,则删除多余元素。list.resize(num,elem);
:重新指定容器的长度为num,以elem填充新位置。
-
list的插入
list.insert(pos, elem);
在pos位置插入一个elem元素的拷贝,返回新的数据的位置;(pos为迭代器)list.insert(pos, n, elem);
在pos位置插入n个elem元素,无返回值;list.insert(pos, beg, end);
在pos位置插入[beg, end)区间的数据,无返回值;
由于list是双向链表,不是连续存储,因此在插入结点后不会导致迭代器失效。
- list的删除
list.clear();
移除容器的所有数据;list.erase(beg, end);
删除[beg, end)区间的数据,返回下一个数据的位置;list.erase(pos);
删除pos位置的数据,返回下一个数据的位置;list.remove(elem);
删除容器中所有与elem值匹配的元素。
- list反序排列
list.reverse();
反转链表,比如lst包含1,3,5元素,反转后,lst包含5,3,1.