设为首页收藏本站 |天气与日历| 2025-07-02 星期三 01:42:00 乙巳(蛇)年 六月初八 丑时
     
切换到窄版

私人站点

 找回密码
 立即注册
搜索
查看: 244|回复: 0

标准模板库(STL)学习探究之deque容器(两端)

[复制链接]

954

主题

954

帖子

3879

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3879
发表于 2022-1-18 10:30:39 | 显示全部楼层 |阅读模式
deque表示双端队列在STL中,其实现类似vector,支持随机访问
主要区别在于,从deque对象的开始位置插入和删除元素的时间是固定的,而不像vector中那样是线性时间。所以多数操作发生在序列的起始和结尾处,则应考虑使用deque数据结构。
此外,为了实现deque两端执行插入和删除操作的时间为固定的这一目的,deque对象的设计比vector对象更为复杂。
因此,尽管二者都提供对元素的随机访问和在序列中部指向线性时间的插入和删除操作,但vector容器执行这些操作更快些。
1. 头文件包含
[C] 纯文本查看 复制代码
#include<deque>

构造函数
[C] 纯文本查看 复制代码
std::deque<int> dq;        //创建一个empty的int型队列

std::deque<int> dq(8);  //创建一个有8个元素的int型队列,默认初始化值(value)为0

std::deque<int> dq(8, 50);  //创建一个有8个元素的int型队列,默认初始化值(value)都设为50

std::deque<int> dq(dq.begin(), dq.end()); //通过迭代器创建队列

std::deque<int> dq1(dq);        //通过拷贝构造创建队列


3. 常用函数方法

Operators []:可以使用[]操作符访问双向队列中单个的元素。

[C] 纯文本查看 复制代码
1. assign()        设置双向队列的值
2. at()        返回指定的元素
3. back()        返回最后一个元素
4. begin()        返回指向第一个元素的迭代器
5. clear()        删除所有元素
6. empty()        返回真如果双向队列为空
7. end()        返回指向尾部的迭代器
8. erase()        删除一个元素
9. front()        返回第一个元素
10. get_allocator()        返回双向队列的配置器
11. insert()        插入一个元素到双向队列中
12. max_size()        返回双向队列能容纳的最大元素个数
13. pop_back()        删除尾部的元素
14. pop_front()        删除头部的元素
15. push_back()        在尾部加入一个元素
16. push_front()        在头部加入一个元素
17. rbegin()        返回指向尾部的逆向迭代器
18. rend()        返回指向头部的逆向迭代器
19. resize()        改变双向队列的大小
20. size()        返回双向队列中元素的个数
21. swap()        和另一个双向队列交换元素


4. 以上方法函数原型和简单解释
assign
语法:
void assign( input_iterator start, input_iterator end);
void assign( Size num, const TYPE &val );
assign()函数用start和end指示的范围为双向队列赋值,或者设置成num个val。

at
语法:
reference at( size_type pos );
at()函数返回一个引用,指向双向队列中位置pos上的元素。

back
语法:
reference back();
back()返回一个引用,指向双向队列中最后一个元素。

begin
语法:
iterator begin();
begin()函数返回一个迭代器,指向双向队列的第一个元素。

clear
语法:
void clear();
clear()函数删除双向队列中所有元素。

empty
语法:
bool empty();
empty()返回真如果双向队列为空,否则返回假。

end
语法:
iterator end();
end()函数返回一个迭代器,指向双向队列的尾部。

erase
语法:
iterator erase( iterator pos );
iterator erase( iterator start, iterator end );
erase()函数删除pos位置上的元素,或者删除start和end之间的所有元素。返回值是一个iterator,指向被删除元素的后一个元素。

front
语法:
reference front();
front()函数返回一个引用,指向双向队列的头部。

get_allocator
语法:
allocator_type get_allocator();
get_allocator()函数返回双向队列的配置器。

insert
语法:
iterator insert( iterator pos, size_type num, const TYPE &val );
void insert( iterator pos, input_iterator start, input_iterator end );
insert()在pos前插入num个val值,或者插入从start到end范围内的元素到pos前面。

max_size
语法:
size_type max_size();
max_size()返回双向队列能容纳的最大元素个数。

pop_back
语法:
void pop_back();
pop_back()删除双向队列尾部的元素。

pop_front
语法:
void pop_front();
pop_front()删除双向队列头部的元素。

push_back
语法:
void push_back( const TYPE &val );
push_back()函数在双向队列的尾部加入一个值为val的元素。

push_front
语法:
void push_front( const TYPE &val );
push_front()函数在双向队列的头部加入一个值为val的元素。

rbegin
语法:
reverse_iterator rbegin();
rbegin()返回一个指向双向队列尾部的逆向迭代器。

rend
语法:
reverse_iterator rend();
rend()返回一个指向双向队列头部的逆向迭代器。

resize
语法:
void resize( size_type num, TYPE val );
resize()改变双向队列的大小为num,另加入的元素都被填充为val。

size
语法:
size_type size();
size()函数返回双向队列中的元素个数。

swap
语法:
void swap( deque &target );
swap()函数交换target和现双向队列中元素。

思考:deque 为两端开口的非线形容器,它的原理是有一个控制器存储所有元素的地址.控制器存储的地址的控制 容器伸缩性.该deque有vector 的特性和优点,并且支持头尾增删(vector只支持尾端操作),避免了其他容器实现头部增删带来的繁琐步骤.并且该容器迭代器,也支持随机读写.非常强大.

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|编程站点 ( 冀ICP备2023028127号-2 )|友链申请|

GMT+8, 2025-7-2 01:42 , Processed in 0.081895 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表