c++STL总结三(容器)

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();-------反转

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值