C++ STLdeque基本概念

  • vector和deque区别:
    vector对于头部的插入和删除效率低,数据量越大,效率越低
    deque相对而言对于头部的插入和删除速度比vector快(deque支持头部和尾部的删除和插入操作)
    vector访问元素的速度会比deque快,这和两者内部实现有关

在这里插入图片描述

  • deque内部工作原理:
    deque内部有个中控器,维护每段缓冲器中的内容,缓冲器存放真实数据
    中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间
    对头部数据和尾部数据的插入和删除比较快,但访问元素时,需要找到指针指向对应的缓存区,比较慢
    在这里插入图片描述

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

  • deque赋值操作
    1.deque& operator=(const deque&deq) //重载赋值操作运算符
    2.assign(beg, end) //将beg到end之间数据拷贝给本身
    3.assign(n, elem) //将n个elem赋值给本身

  • deque大小操作
    deque.empty() //判断容器是否为空
    deque.size() //返回容器中元素个数(deque没有容量大小之说)
    deque.resize(num) //重写指定容器长度为num,若容器变长则以默认值填充新位置
    //如果容器变短,则末尾超出容器长度的元素被删除
    deque.resize(num,elem)//重写指定容器长度为num,若容器变长则以elem值填充新位置
    //如果容器变短,则末尾超出容器长度的元素被删

  • 两端插入操作
    push_back(elem); //容器尾部添加
    push_front(elem); //容器头部添加
    pop_back(); //尾部删除
    pop_front(); //头部删除

  • 指定位置操作
    insert(pos, elem); //pos位置插入一个elem元素的拷贝,返回新数据的位置
    insert(pos, n, elem); //pos位置插入n个elem数据,无返回值
    insert(pos, beg, end);//pos位置插入beg,end区间的数据,无返回值
    clear(); //清空容器中的所有数据
    erase(beg, end); //删除beg,end区间的数据,返回下一个数据的位置
    erase(pos); //删除pos位置的数据,返回下一个数据的位置

  • 数据存取
    at(int idx); //返回索引idx所指的数据
    operator[](int idx); //返回索引idx所指的数据
    front(); //返回容器中第一个数据元素
    back(); //返回容器中最后一个数据元素

  • 排序 需要包含头文件algorithm
    sort(beg, end); //对beg,end区间元素进行排序

#include <iostream>
#include <string>
#include <deque>

using namespace std;

//传入常引用,则对应的迭代器也是常迭代器
void printdeque(const deque<int> &deq)
{
	for (deque<int>::const_iterator it=deq.begin(); it!=deq.end(); it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;

}
//构造函数的使用
void test1()
{

	deque<int> deq;
	for (int i = 0; i<10; i++)
	{
		//deq.push_back(i);		//尾插入0 1 2 3 4 5 6 7 8 9
		deq.push_front(i);		//头插入9 8 7 6 5 4 3 2 1 0
	}

	printdeque(deq);

	deque<int> deq1(deq.begin(), deq.end());
	printdeque(deq1);

	deque<int> deq2(10, 0);
	printdeque(deq2);

	deque<int> deq3(deq2);
	printdeque(deq3);

}

//赋值操作函数
void test2()
{
	deque<int> deq;
	for (int i = 0; i<10; i++)
	{
		deq.push_back(i);
	}
	
	printdeque(deq);
	deque<int> deq1=deq;
	printdeque(deq1);

	deque<int> deq2;
	deq2.assign(deq.begin(), deq.end());
	printdeque(deq2);


	deque<int> deq3;
	deq3.assign(10, 0);
	printdeque(deq3);
}

//deque大小操作
void test3()
{
	deque<int> deq;
	for (int i = 0; i<10; i++)
	{
		deq.push_back(i);
	}
	if (deq.empty())
	{
		cout<<"deq为空"<<endl;
	}
	else
	{
		cout<<"deq不为空"<<endl;
		cout<<"大小:"<<deq.size()<<endl;
	}
	//扩充元素个数
	deq.resize(15);
	printdeque(deq);
	cout<<"大小:"<<deq.size()<<endl;

	//缩短元素个数
	deq.resize(5);
	printdeque(deq);
	cout<<"大小:"<<deq.size()<<endl;

	//赋值指定值进行扩充
	deq.resize(10, 2);
	printdeque(deq);
	cout<<"大小:"<<deq.size()<<endl;

}

//指定位置插入
void test4()
{
	deque<int> deq;
	for (int i = 0; i<10; i++)
	{
		deq.push_back(i);
	}
	printdeque(deq);
	cout<<"大小:"<<deq.size()<<endl;

	deque<int>::iterator it=deq.begin();
	it++;
	//指定位置插入元素
	deq.insert(it,10);
	printdeque(deq);

	//指定位置插入n个元素
	deq.insert(it, 5, 1);
	printdeque(deq);
	
	deque<int> deq1;
	for (i = 0; i<10; i++)
	{
		deq1.push_back(i);
	}
	deque<int>::iterator it1=deq1.begin();
	//指定位置插入begin到end区间元素
	deq1.insert(it1, deq.begin(), deq.end());
	printdeque(deq1);
	
	it1++;
	//删除指定位置元素
	deq1.erase(it1);
	printdeque(deq1);

	//删除begin,end区间元素
	deq1.erase(it1,deq1.end());
	printdeque(deq1);

	//清理deque容器中所有元素
	deq1.clear();
	printdeque(deq1);


}
int main()
{
	//test1();
	//test2();
	//test3();
	test3();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值