STL序列容器之deque
一,deque的基础知识
1.deque的基础
- deque是“double-ended-queue”的缩写,意思是双端队列,其和vector的区别在于vector是单端的。
- deque在头部和尾部插入和删除元素非常快,但是在中部插入和删除元素比较耗时。
- deque支持随机存取元素(即通过数组下标可以直接访问和修改元素),其底层数据结构是数组。
- deque的操作和vector很相似,在许多操作上可以直接替换。
- 在使用deque之前需要导入头文件# include<deque>
二,deque的构造函数
1.无参构造函数
/* 无参构造函数 */
deque<int> d1;
2.带参数的构造函数
/* 带参构造函数一:用10个字符'A'初始化容器 */
deque<char> d1(,'A');
/* 用容器d1的前五个元素来初始化容器d2 */
deque<char> d2(d1.begin(),d1.begin()+);
3.拷贝构造函数
/* 定义含有是个字符'A'的容器 */
deque<char> d1(,'A');
/* 用上面的容器初始化下面的容器 */
deque<char> d2 = d1;
4.析构函数
deque的析构函数用来释放容器中元素所占用的内存。
三,deque的操作符重载
1.赋值操作符重载
// 定义双端队列d1
deque<int> d1(, );
// 定义双端队列d2
deque<int> d2;
// 使用赋值操作
d2 = d1;
2.数组下标操作符重载
// 定义双端队列d
deque<int> d(, );
// 数组下标操作,获取容器第二个元素
int i2 = d[];
cout << "i2 = " << i2 << endl;
// 数组下标操作,修改容器的第三个元素
d2[] = ;
cout << "i3 = " << d[] << endl;
四,deque的成员函数
1.在头部插入和移除元素
// 定义容器
deque<char> d1;
// 头部插入元素
d1.push_front('C');
d1.push_front('B');
d1.push_front('A');
// 头部元素删除
d1.pop_front();
2.在尾部插入和移除元素
// 定义容器
deque<char> d2;
// 尾部插入元素
d2.push_back('X');
d2.push_back('Y');
d2.push_back('Z');
// 删除尾部元素
d2.pop_back();
3.获取头部和尾部元素
// 定义容器
deque<char> d1(,'A');
// 获取首元素
char first = d1.front();
// 获取尾元素
char last = d1.back();
4.获取容器的长度
// 定义容器
deque<char> d1(,'A');
// 获取容器长度
int size = d1.size();
5.清空容器的元素
// 定义容器
deque<char> d1(,'A');
// 清空元素
d1.clear();
6.判断元素是否为空
// 定义容器
deque<char> d1(,'A');
// 判断元素是否为空
bool isEmpty = d1.empty();
7.重置容器长度
// 定义容器
deque<char> d(,'A');
// 重置容器元素为10个,不足的位置用字符'B'替代
d.resize(,'B');
// 重置容器元素为5个,多余的元素删除
d.resize();
8.获取和修改容器元素
// 定义容器
deque<char> d(,'A');
// 获取第3个元素
char c3 = d.at();
// 修改第三个元素
d.at() = 'B';
9.容器插入元素
// 定义容器d1
deque<char> d1(,'A');
// 定义容器d2
deque<char> d2(, 'B');
// 在容器d2的第二个位置插入字符'X'
d2.insert(d2.begin() + , 'X');
// 在容器d2的第四个位置插入5个字符'Z'
d2.insert(d2.begin() + , , 'Z');
// 在容器d2的最后插入容器d1
d2.insert(d2.end(), d1.begin(), d1.end());
10.容器删除元素
// 定义容器d1
deque<char> d1(,'A');
// 删除第2个元素
d1.erase(d1.begin() + );
// 删除第2个到第4个元素(左开右闭)
d1.erase(d1.begin() + , d1.begin() + );
11.容器的遍历
// 定义容器d2
deque<char> d2(,'A');
// 增强for遍历
for (char tmp : d2)
{
cout << tmp << " ";
}
cout << endl;
// 迭代器的正向遍历
for (deque<char>::iterator it = d2.begin(); it != d2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
// 迭代器的反向遍历
for (deque<char>::reverse_iterator it = d2.rbegin(); it != d2.rend(); it++)
{
cout << *it << " ";
}
cout << endl;
12.容器的遍历删除
# include<iostream>
# include<deque> using namespace std; int main()
{
// 定义容器
deque<int> v;
// 添加数据
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
// 这里注意不需要++it
for (deque<int>::iterator it = v.begin(); it != v.end();)
{
// 删除偶数
if (*it % == )
{
// erase删除该元素后返回下一个元素的迭代器
it = v.erase(it);
}
else {
it++;
}
}
// 遍历
for (int tmp : v)
{
cout << tmp << " ";
}
cout << endl; return ;
}
五,deque存储自定义数据类型
1.定义学生类
#pragma once
# include<iostream>
using namespace std; class Student
{
private:
char * name;
int age;
public:
Student();
Student(char * name, int age);
Student(const Student& student);
~Student();
public:
friend ostream& operator<<(ostream& out, Student& student);
};
2.学生类的实现
# define _CRT_SECURE_NO_WARNINGS
# include<iostream>
# include "Student.h"
using namespace std; /* 无参构造函数 */
Student::Student()
{
this->name = NULL;
this->age = ;
}
/* 有参构造函数 */
Student::Student(char * name, int age)
{
this->name = new char[strlen(name) + ];
strcpy(this->name, name);
this->age = age;
}
/* 拷贝构造函数 */
Student::Student(const Student& student)
{
this->name = new char[strlen(student.name) + ];
strcpy(this->name, student.name);
this->age = student.age;
}
/* 析构函数 */
Student::~Student()
{
if (this->name != NULL)
{
delete[] this->name;
this->name = NULL;
this->age = ;
} }
/* 左移操作符重载 */
ostream& operator<<(ostream& out, Student& student)
{
out << student.name << " = " << student.age;
return out;
}
3.测试类
# include<iostream>
# include<deque>
# include"Student.h"
using namespace std; int main()
{
// 定义自定义对象
Student s1("刘备", );
Student s2("关羽", );
Student s3("张飞", );
// 放入容器
deque<Student> d;
// 存入
d.push_back(s1);
d.push_back(s2);
d.push_back(s3);
// 遍历
for (Student stu : d)
{
cout << stu << endl;
} return ;
}
STL序列容器之deque的更多相关文章
- C++STL模板库序列容器之deque
目录 一丶队列容器deque简介 二丶使用代码演示 一丶队列容器deque简介 deque底层跟vector一样,都是数组维护.不同的是可以操作头部. 二丶使用代码演示 #define _CRT_SE ...
- STL序列容器之vector
一,vector容器简介 1.vector容器的原理 vector是将元素置于一个动态数组中加以管理的容器. 2.vector容器的特点 vector容器可以随机存取元素,支持索引存取(即用数组下标的 ...
- C++顺序容器之deque初探
C++顺序容器之deque初探 deque是双端队列,与vector非常相似,是顺序容器,不同的是,deque可以在数组开头和末尾插入和删除数据.支持快速随机访问. #include<iostr ...
- C++STL模板库序列容器之vector
目录 STL之Vecter 一丶STL简介 二丶Vector用法 1.vector容器的使用 2.vector迭代器. 3.vector中的方法. 三丶常用算法 1.常见算法中的算法方法. 2.sor ...
- C++STL模板库序列容器之List容器
目录 一丶List容器的存储结构 二丶丶STL中list容器的使用. 一丶List容器的存储结构 list容器底层是链表结构来维护的.跟vector不一样. vector是数组维护的.拥有连续内存.所 ...
- STL容器之deque
[1]deque容器 deque 是对 vector 和 list 优缺点的结合,它是处于两者之间的一种容器. [2]deque方法集 应用示例代码: #include <deque> # ...
- C++ STL 常用容器之 stack
C++ STL Container--Stack 栈是一种先进后出(LIFO)的数据结构,限制只能在一端完成插入和删除操作,这一端叫做栈顶(top),另一端即为栈底(bottom).C++ STL(S ...
- C++序列容器之 vector常见用法总结
一.关于vector 本文默认读者具有一定的c++基础,故大致叙述,但保证代码正确. vector是一个动态的序列容器,相当于一个size可变的数组. 相比于数组,vector会消耗更多的内存以有效的 ...
- [知识点]C++中STL容器之map
UPDATE(20190416):写完vector和set之后,发现不少内容全部引导到map上了……于是进行了一定的描述补充与更正. 零.STL目录 1.容器之map 2.容器之vector 3.容器 ...
随机推荐
- 百度ueditor vue项目应用 -- 图片上传源码修改
本文目的有两个,一.废掉单图上传,二.改造多图上传 大家都知道百度ueditor不是针对vue项目开发的,官方文档提供的源码包里有需要后端配置的接口,but到vue项目就不太好办了,网上有些文章也介绍 ...
- 【Codeforces Round #435 (Div. 2) A】Mahmoud and Ehab and the MEX
[链接]h在这里写链接 [题意] 在这里写题意 [题解] 让x没有出现,以及0..x-1都出现就可以了. [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/std ...
- HDU 1405 The Last Practice 数学水题
http://acm.hdu.edu.cn/showproblem.php?pid=1405 题目大意: 给你一个数,让你分解素因子,输出它的各次幂. 如60 输出:2 2 3 1 5 1 (60=2 ...
- 【39.66%】【codeforces 740C】Alyona and mex
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- LinearLayout的一些注意事项 分类: H1_ANDROID 2013-10-26 23:01 856人阅读 评论(0) 收藏
1.orientation的默认值为horizontal,即从左向右排列.由于一般从上向下排列,所以必须指定orientation属性. 2.layout_gravity与gravity的区别: (1 ...
- jquery的图片异步加载
<script src="jquery.js"></script> <script src="jquery.lazyload.js" ...
- PDF编译出现错误解决的方法————————【Badboy】
额 今天 在编译PDF时发现使用了一下STL中的z数值极限居然编译只是. return GetRangeConstraint(value <= std::numeric_limits::max ...
- php自带加密解密函数
php自带加密解密函数 一.总结 一句话总结:可逆和不可逆函数. 二.php自带加密解密函数 1.不可逆的加密函数为:md5().crypt() md5() 用来计算 MD5 哈稀.语法为:strin ...
- oracle 中日期的加减
oracle 中日期的加减 加法 select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add_ ...
- [网络管理]windows server backup
ERPserver每天备份与每月1号备份数据.备份到本机.从备份安全机制来说这是远远不够的.故是否能定期备份数据文件到另外一台server呢?(异地备份) windows server 提供了serv ...