2021-03-18-C++学习之16-deque

一、deque容器基本概念

  • 功能:双端数组,可以对头端进行插入和删除操作。
  • deque与vector区别;
    • vector对于头部的插入删除效率低,数据量越大,效率越低。
    • deque相对而言,对头部的插入删除速度比vector快。
    • vector访问元素时的速度会比deque快,这和两者内部实现有关。
      在这里插入图片描述
      deque内部工作原理:
      deque内部有个中控器,维护每个阶段缓冲区中的内容,缓冲区中存放真实数据。中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间。
      在这里插入图片描述
      deque容器的迭代也是支持随机访问的。

二、deque构造函数
函数原型:
在这里插入图片描述
代码测试:

#include<iostream>
using namespace std;
#include<string>
//STL中的每个容器在使用时都需要包含头文件
#include<deque>
#include<algorithm> //标准算法头文件

void printDeque(const deque<int>&d)
{
	for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//deque构造函数
void test01()
{
	deque<int>d1;
	for (int i = 0; i < 10; i++)
	{
		d1.push_back(i);
	}
	printDeque(d1);

	deque<int>d2(d1.begin(), d1.end());
	printDeque(d2);

	deque<int>d3(5, 100);
	printDeque(d3);

	deque<int>d4(d3);
	printDeque(d4);
}

int main()
{
	test01();
	
	system("pause");
	return 0;
}

输出:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
100 100 100 100 100
100 100 100 100 100
请按任意键继续. . .

三、deque容器赋值操作
函数原型:
在这里插入图片描述
代码测试:

#include<iostream>
using namespace std;
#include<string>
//STL中的每个容器在使用时都需要包含头文件
#include<deque>
#include<algorithm> //标准算法头文件

void printDeque(const deque<int>&d)
{
	for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//deque赋值
void test01()
{
	deque<int>d1;
	for (int i = 0; i < 10; i++)
	{
		d1.push_back(i);
	}
	printDeque(d1);

	// operator= 赋值
	deque<int>d2 = d1;
	printDeque(d2);

	// assign 赋值
	deque<int>d3;
	d3.assign(d1.begin(), d1.end());
	printDeque(d3);

	//n个数  赋值
	deque<int>d4;
	d4.assign(5, 100);
	printDeque(d4);
}

int main()
{
	test01();
	
	system("pause");
	return 0;
}

输出:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
100 100 100 100 100
请按任意键继续. . .

四、deque大小操作
函数原型:

deque没有容量概念。
代码测试:

#include<iostream>
using namespace std;
#include<string>
//STL中的每个容器在使用时都需要包含头文件
#include<deque>
#include<algorithm> //标准算法头文件

void printDeque(const deque<int>&d)
{
	for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	deque<int>d1;
	for (int i = 0; i < 10; i++)
	{
		d1.push_back(i);
	}
	printDeque(d1);

	if (d1.empty()) //判断是否为空
	{
		cout << "d1为空" << endl;
	}
	else
	{
		cout << "d1不为空" << endl;
		cout << "d1大小为:" << d1.size() << endl; //返回元素个数
		//deque没有容量概念
	}

	//重新指定大小
	d1.resize(15, 1); //输出:0 1 2 3 4 5 6 7 8 9 1 1 1 1 1
	printDeque(d1);

	d1.resize(5);
	printDeque(d1);//输出:0 1 2 3 4
}

int main()
{
	test01();
	
	system("pause");
	return 0;
}

输出:

0 1 2 3 4 5 6 7 8 9
d1不为空
d1大小为:10
0 1 2 3 4 5 6 7 8 9 1 1 1 1 1
0 1 2 3 4
请按任意键继续. . .

五、deque插入和删除
函数原型:

  • 两端插入操作:
    在这里插入图片描述
  • 指定位置操作:
    在这里插入图片描述
    代码测试:
#include<iostream>
using namespace std;
#include<string>
//STL中的每个容器在使用时都需要包含头文件
#include<deque>
#include<algorithm> //标准算法头文件

void printDeque(const deque<int>&d)
{
	for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//deque插入和删除
void test01()
{
	cout << "test01 run ..." << endl;
	deque<int>d1;

	//尾插
	d1.push_back(10);
	d1.push_back(20);
	//头插
	d1.push_front(30);
	d1.push_front(40);
	//40 30 10 20
	printDeque(d1);  

	//尾删
	d1.pop_back();
	//40 30 10
	printDeque(d1);
	//头删
	d1.pop_front();
	//30 20
	printDeque(d1);
}
void test02()
{
	cout << "test02 run ..." << endl;
	deque<int>d1;
	d1.push_back(10);
	d1.push_back(20);
	d1.push_front(30);
	d1.push_front(40);
	//40 30 10 20
	printDeque(d1);
	//insert插入
	//在起始位置插入1000
	d1.insert(d1.begin(), 1000);
	//1000 40 30 10 20
	printDeque(d1);

	//在头部插入两个10000
	d1.insert(d1.begin(), 2, 10000);
	//10000 10000 1000 40 30 10 20
	printDeque(d1);

	//按照区间进行插入
	deque<int>d2;
	d2.push_back(1);
	d2.push_back(2);
	d2.push_back(3);

	//将d2的所有区间元素插入d1头部
	d1.insert(d1.begin(), d2.begin(), d2.end());
	//1 2 3 10000 10000 1000 40 30 10 20
	printDeque(d1);
}
void test03()
{
	cout << "test03 run ..." << endl;
	deque<int>d1;
	d1.push_back(10);
	d1.push_back(20);
	d1.push_front(30);
	d1.push_front(40);

	//删除
	deque<int>::iterator it = d1.begin();
	it++;
	d1.erase(it);
	//40 10 20
	printDeque(d1);

	//按照区间方式删除
	d1.erase(d1.begin(), d1.end());
	//换行
	//printDeque(d1);

	//清空
	d1.clear();
	//换行
	printDeque(d1);
}
int main()
{
	test01();
	test02();
	test03();
	
	system("pause");
	return 0;
}

输出:

test01 run ...
40 30 10 20
40 30 10
30 10
test02 run ...
40 30 10 20
1000 40 30 10 20
10000 10000 1000 40 30 10 20
1 2 3 10000 10000 1000 40 30 10 20
test03 run ...
40 10 20

请按任意键继续. . .
  • 总结:
    • 插入和删除提供的位置是迭代器。
    • 尾插 — push_back
    • 尾删 — pop_back
    • 头插 — push_front
    • 头删 — push_back

六、deque数据存取
函数原型:
在这里插入图片描述
代码测试:

#include<iostream>
using namespace std;
#include<string>
//STL中的每个容器在使用时都需要包含头文件
#include<deque>
#include<algorithm> //标准算法头文件

void printDeque(const deque<int>&d)
{
	for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//deque数据存取
void test01()
{
	cout << "test01 run ..." << endl;
	deque<int>d1;
	d1.push_back(10);
	d1.push_back(20);
	d1.push_back(30);
	d1.push_front(100);
	d1.push_front(200);
	d1.push_front(300);
	
	//通过 [] 方式访问元素
	//300 200 100 10 20 30
	for (int i = 0; i < d1.size(); i++)
	{
		cout << d1[i] << " ";
	}
	cout << endl;

	//通过at方式访问元素
	//300 200 100 10 20 30
	for (int i = 0; i < d1.size(); i++)
	{
		cout << d1.at(i) << " ";
	}
	cout << endl;

	cout << "第一个元素为:" << d1.front() << endl; //300
	cout << "最后一个元素为:" << d1.back() << endl; //30
}

int main()
{
	test01();
	
	system("pause");
	return 0;
}

七、deque排序
算法:

sort(iterator beg,iterator end); //对beg和end的区间内元素进行排序

代码测试:

#include<iostream>
using namespace std;
#include<string>
//STL中的每个容器在使用时都需要包含头文件
#include<deque>
#include<algorithm> //标准算法头文件

void printDeque(const deque<int>&d)
{
	for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//deque容器排序
void test01()
{
	cout << "test01 run ..." << endl;
	deque<int>d1;
	d1.push_back(10);
	d1.push_back(20);
	d1.push_back(30);
	d1.push_front(100);
	d1.push_front(200);
	d1.push_front(300);
	cout << "排序前:";
	printDeque(d1); //300 200 100 10 20 30

	//排序 --- 默认排序是升序,从小到大
	//对于支持随机访问迭代器的容器,都可以利用sort算法直接对其进行排序
	//vector容器也可以利用sort进行排序
	//使用sort需要包含标准算法头文件
	sort(d1.begin(), d1.end());
	cout << "排序后:";
	printDeque(d1); //10 20 30 100 200 300
}

int main()
{
	test01();
	
	system("pause");
	return 0;
}

输出:

test01 run ...
排序前:300 200 100 10 20 30
排序后:10 20 30 100 200 300
请按任意键继续. . .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习的代码小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值