C++ deque容器

deque容器的基本概念

功能:

  • 双端数组,可以对头端进行插入删除操

duque和vector的区别:

  • vector对于头部的插入删除效率较低,数据量越大,效率越低
  • deque相对而言,对头部的插入和删除速度要比vector快
  • vector访问元素时的速度要比deque快,这和两者内部实现有关

deque的内部工作原理:
deque内部有个中控器,维护每段缓冲区中的内存,缓冲区中存放真实数据
中控器维护的是每个缓冲区的地址,使得使用deque时像是一片连续的内存空间

deque构造函数

功能:

  • deque容器构造

函数原型:

  • deque deq; //默认构造函数
  • deque(beg,end); //构造函数将[beg, end]区间中的元素拷贝给本身
  • deque(n ,elem); //构造函数将n个elem拷贝给本身
  • deque(const deque &deq); //拷贝构造函数

示例:

#include<iostream>
using namespace std;
#include<deque>
//deque构造函数
//- deque<T> deq;    //默认构造函数
//-deque(beg, end);    //构造函数将[beg, end]区间中的元素拷贝给本身
//-deque(n, elem);    //构造函数将n个elem拷贝给本身
//-deque(const deque & deq);    //拷贝构造函数
void Print(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		//*it = 100;传入的是常量引用,不可对其进行修改操作
		cout << *it << "  ";
	}
	cout << endl;
}

void _01Test01()
{
	//默认构造
	deque<int>d1;
	for (int i = 0; i < 10; i++)
	{
		d1.push_back(i);
	}
	Print(d1);

	//-deque(beg, end);    //构造函数将[beg, end]区间中的元素拷贝给本身
	deque<int> d2(d1.begin() + 1, d1.end() - 1);
	Print(d2);

	//-deque(n, elem);    //构造函数将n个elem拷贝给本身
	deque<int> d3(10, 100);
	Print(d3);

    //-deque(const deque & deq);    //拷贝构造函数
	deque<int>d4(d3);
	Print(d4);
	
}

void main()
{
	_01Test01();
}

deque容器赋值操作

功能:

  • 给deque容器进行赋值操作

函数原型:

  • deque& operator=(const deque& deq); //重载赋值运算符
  • assign(beg,end); //将[beg,end]区间中的数据拷贝赋值给本身
  • assign(n, elem); //将n个elem拷贝赋值给本身
#include<iostream>
using namespace std;
#include<deque>
//vector赋值操作

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

void _02Test01()
{
	//等号赋值
	deque<int>d1;
	for (int i = 0; i < 10; i++)
	{
		d1.push_back(i);
	}
	deque<int>d2 = d1;
	cout << "d2: ";
	ShowDeque(d2);

	//assign(v.begin(),v.end());
	deque<int> d3(d1.begin(), d1.end());
	cout << "d3: ";
	ShowDeque(d3);

	//assign(n, elem)
	deque<int>d4(10, 100);
	cout << "d4: ";
	ShowDeque(d4);
}

void main()
{
	_02Test01();
}

deque容量和大小

功能:
对deque容器进行容量和大小的操作
函数原型:
empty(); //判断容器容量是否为空
size(); //返回容器中元素的个数
resize(int num); //重新指定容器的长度为num,若容器变长,则默认值0填充新的位置。如果容器变短,则末尾 超出容器长度的元素被删除。
resize(int num, elem); //重新指定容器的长度为num, 若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除

示例:

#include<iostream>
using namespace std;
#include<deque>

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

void _03Test01()
{
	deque<int> d;
	for (int i = 0; i < 10; i++)
	{
		d.push_back(i);
	}
	PrintMyDeque(d);

	//判断容器是否为空
	if (d.empty())
	{
		cout << "容器为空" << endl;
	}
	else {
		cout << "容器不为空" << endl;
		cout << "容器大小为:" << d.size() << endl;
		//cout << "容器容量为:" <<d.capacity() << endl;
	}

	//重新指定大小
	d.resize(20);
	//cout << "重新指定大小后,容器容量为:" << v.capacity() << endl;

	//重新指定大小并填入elem
	d.resize(25, 2);
	PrintMyDeque(d);
	cout << "重新指定大小并填入elem,容器大小为:" << d.size() << endl;
	//cout << "重新指定大小并填入elem,容器容量为:" << v.capacity() << endl;
}

void main()
{
	_03Test01();
}

deque插入和删除

功能:
对deque容器进行插入、删除操作

函数原型:
两端插入操作:

  • push_back(elem); //在容器尾部插入一个数据
  • push_front(elem); //在容器头部插入一个数据
  • pop_back(); //删除容器最后一个数据
  • pop_front(); //删除容器第一个数据
    指定位置操作:
  • insert(pos,elem); //迭代器指向位置pos插入一个元素elem,返回新数据的位置
  • inser(pos, n, elem) //迭代器指向位置pos插入n个元素elem,无返回值
  • insert(pos, beg, end); //在pos位置插入[beg, end] 区间的数据,无返回值
  • erase(const_iterator pos); //删除迭代器指向的元素
  • erase(const_iterator start, const_iterator end); //删除迭代器从start到end之间的元素
  • clear(); //删除容器中的所有元素

示例:

#include<iostream>
using namespace std;
#include<deque>
//deque 插入和删除数据操作
//- push_back(elem);    //在容器尾部插入一个数据
//-push_front(elem);   //在容器头部插入一个数据
//-pop_back();    //删除容器最后一个数据
//-pop_front();    //删除容器第一个数据
//**指定位置操作:**
//-insert(pos, elem);    //迭代器指向位置pos插入一个元素elem,返回新数据的位置
//-inser(pos, n, elem)    //迭代器指向位置pos插入n个元素elem,无返回值
//- insert(pos, beg, end);    //在pos位置插入[beg, end] 区间的数据,无返回值
//-erase(const_iterator pos);    //删除迭代器指向的元素
//-erase(const_iterator start, const_iterator end);    //删除迭代器从start到end之间的元素
//-clear();    //删除容器中的所有元素
void MyShowDeq(deque<int>& d)
{
	if (d.empty())
	{
		cout << "容器为空" << endl;
		return;
	}
	for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}

void _04Test01()
{
	//尾插
	deque<int> d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_back(40);
	d.push_back(50);

	//遍历
	MyShowDeq(d);

	//头插
	d.push_front(100);
	MyShowDeq(d);

	//尾删
	d.pop_back();
	MyShowDeq(d);

	//头删
	d.pop_front();
	MyShowDeq(d);

	//插入 第一个参数是迭代器
	d.insert(d.begin() + 1, 100);
	MyShowDeq(d);

	//删除 参数也是迭代器
	d.erase(d.begin() + 1);
	MyShowDeq(d);

	//清空容器
	d.clear();
	MyShowDeq(d);

}

void main()
{
	_04Test01();
}

deque数据存取

功能:
对deque中的数据进行存取操作
函数原型:
at(int index); //返回索引index所指的数据
operator[](int index); //返回索引index所指的数据
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素

示例:

#include<iostream>
using namespace std;
#include<deque>
//数据存取
//at(int index);    //返回索引index所指的数据
//operator[](int index);    //返回索引index所指的数据
//front();    //返回容器中第一个数据元素
//back();    //返回容器中最后一个数据元素
void MyShowVector(deque<int>& d)
{
	if (d.empty())
	{
		cout << "容器为空" << endl;
		return;
	}
	for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}
void _05Test01()
{
	deque<int> d;
	for (int i = 0; i < 10; i++)
	{
		d.push_back(i);
	}
	MyShowVector(d);

	//利用[]下标方式来访问数组的元素
	cout << "利用下标访问: ";
	for (int i = 0; i < d.size(); i++)
	{
		cout << d[i] << "  ";
	}
	cout << endl;

	//利用at方式来访问元素
	cout << "利用at方式来访问元素: ";
	for (int i = 0; i < d.size(); i++)
	{
		cout << d.at(i) << "  ";
	}
	cout << endl;

	//获取第一个元素
	cout << "第一个元素为:" << d.front() << endl;

	//获取最后一个元素
	cout << "最后一个元素为: " << d.back() << endl;

}

void main()
{
	_05Test01();
}

deque容器排序

功能:

  • 利用算法实现对deque容器进行排序
    算法:
  • sort(iterator beg, iterator end); //对beg和end区间内元素进行排序
    示例:
#include<iostream>
using namespace std;
#include<deque>
#include<algorithm>
//deque容器 排序
//- sort(iterator beg, iterator end);    //对beg和end区间内元素进行排序
void ShowMyVector(deque<int>& d)
{
	if (d.empty())
	{
		cout << "容器为空" << endl;
		return;
	}
	for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}

void _06Test01()
{
	deque<int> d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_back(40);
	d.push_front(100);
	d.push_front(200);
	d.push_front(400);
	d.push_front(300);
	cout << "排序前:" << endl;
	ShowMyVector(d);

	sort(d.begin(), d.end());
	cout << " 排序后:" << endl;
	ShowMyVector(d);
	
}

void main()
{
	_06Test01();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值