deque容器(双端容器)
功能:
双端数组,可以对头端进行插入删除操作
与vector的区别:
(1)vector对于头部的插入删除效率低,数据量越大,效率越低
(2)deque相对而言,对头部的插入删除速度比vector快
(3)vector访问元素时的速度会比deque快(vector内部是一段连续的存储空间),这和两者内部实现有关
工作原理
中控器:维护每段缓冲区的地址,使得使用deque时像一片连续的内存空间
缓冲区:有多个,存放真实的数据
deque容器的迭代器也是支持随机访问的,可跳跃式访问元素
各种操作和接口
构造函数
deque < int > d1; ------- 默认构造函数,容器无元素
deque< int >d2(d1.begin(),d2.end());-------用区间方式赋值
deque< int >d3(10,100) ; ---------10个100的容器
deque< int >d4(d3); -----------------拷贝构造函数
赋值操作
deque operator=(const deque &deq) //重载等号=运算符
d2.assign(d1.begin(),d1.end()) ------ 拷贝构造某个区间的值给d2
d2.assign(n,elem) -------将n个elem拷贝赋值给d2
其他操作函数建议参考c++API手册就行
输出:迭代器或者[]或者at函数输出
排序:sort(d1.begin(),d2.end())
stack容器(栈)
概念: stack是一种先进后出的数据结构,只有一个出口
栈中只有顶端的元素才能被访问到,不允许遍历整个容器
栈中进入数据-----入栈 push
栈中弹出数据-----出栈 pop
常用接口:
构造:stack< T >stk;
stack(const stack &stk) //拷贝构造函数
push(elem) ----- 向栈顶添加元素
pop() ------------- 弹出栈顶元素
top() ------------- 返回栈顶元素
大小操作:
empty() ----------判断堆栈是否为空
size() -----------返回栈的大小
queue容器(队列)
概念:
queue是一种先进先出的数据结构,有两个口,一个插入数据,一个弹出数据
队列只有对头和队尾才可以被外界使用,不允许有遍历行为
进数据------入队-------Push()
出数据------出队-------pop()
常用接口:
构造:queue< T >que;
queue (const queue &que); 拷贝构造函数
queue &operator=(const queue &que) //重载等号运算符
push(elem) 向队尾添加元素
pop() 弹出对头一个元素
back() 返回最后一个元素
font() 返回第一个元素
empty() 判断大小
size() 队列的大小
List容器(链表):
对数据进行链式存储,STL中的链表是个双向循环链表
由于链表的存储方式不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器
优点:
(1)采用动态内存分配,不会造成内存浪费和溢出
(2)链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
缺点:
链表灵活,但是空间(指针域)和时间(遍历)额外耗费较大
list有个重要的性质,插入操作和删除操作都不会造成原有迭代器的失效,这在vector中是不成立的_
总结:
STL中List和vector是两个最常容器,一个代表线式存储结构,一个是链式存储结构,各有优缺点。
构造函数:
list< T >lst; -------默认构造函数
list< T >lst(l.begin(),l.end()); -------区间型构造
list< T >lst(n,elem); -------用n个elem构造list
list< T >lst(l); -------拷贝构造
赋值与交换
assign(beg,end); ------将[beg,end)区间中的数据拷贝赋值给本身
assign(n,elem); ------将个elem赋值给本身
list &operator=(const list &lst);-重载了等号运算符
lst.swap(l); ------将l于本身lst的元素互换
数据存取
List底层是链表结构,所以不支持[]和at进行跳跃式访问
front() ----返回第一个元素
back() ----返回最后一个元素
迭代器也不支持随机访问,只能通过偏移来获得元素(++ --)支持双向
反转与排序:
所有不支持随机访问迭代器的容器(只有List),不可以用标准算法:sort(l.begin(),l.end()),reverse(l.begin(),l.end())此类容器内部会提供对应一些算法
lst.sort(); ---------默认从小到大排序
lst.sort(function());--------自己指定排序规则(与标准sort相似)
自己设置从大到小排序的函数:
bool Rule(int a,int b)
{
if(a>b) return true;
//当a在b前面时函数返回true;
}
lst.sort(Rule);
自定义数据类型必须给出排序规则_
lst.reverse();-------反转