STL库--deque双端动态数组

23 篇文章 0 订阅

概念

deque兼顾了数组和链表的优点:即是连续存储结构,又支持在两端添加/删除元素

 问题:对deque进行排序操作复杂度高

deque容器和vector容器最大的差异:

1.deque插入和删除常数项时间(无论数据有多少,需要的时间都是固定的)

2.deque容器没有容量的概念由一段一段的定量的连续空间构成

随时可以增加一段新的空间并链接起来, 换句话说, 像vector 那样, ”旧空间不足而重新配置一块更大空间, 然后复制元素, 再释放旧空间”这样的事情在 deque 身上是不会发生的。

①因此, deque 没有必须要提供所谓的空间保留(reserve)功能

②但是,它的随机迭代器并不是普通的指针, 其复杂度和vector不是一个量级,

③对deque 进行的排序操作, 为了最高效率, 可将 deque 先完整的复制到一个 vector 中, 对 vector 容器进行排序, 再复制回 deque.

初始化deque对象的方式

deque<T>  v1;//默认的初始化方式,内容为空

deque<T>  v2(v1);//v2是v1的一个副本

deque<T>  v3(n,i);//v3中包含了n个数值为i的元素

deque<T>  v4(n);//v4中包含了n个元素,每个元素的值都是0

deque<T>  v5(v1.begin(),v1.end());//v5包含v1的一个区域元素[v1.begin,v1.end());

        begin和end只要是地址即可,普通数组也可以完成

deque常用函数

v1.empty():判断向量是否为空,为空返回真,否则为假

v1.begin():返回向量(数组)的首元素地址

v1.end(): 返回向量(数组)的末元素的下一个元素的地址

v1.rbegin():返回逆向队列的第一个数据,即c容器的最后一个数据。

v1.rend():返回逆向队列的最后一个数据的下一个位置,即c容器的第一个数据再往前的一个位置。

deque<int> v;

v.push_back(1);

v.push_back(2);

v.push_back(3);

deque<int>::reverse_iterator it;

for(it = v.rbegin();it!=v.rend();it++){

    cout << *it << "\t";

}

cout << endl;

v1.clear():清空向量

v1.front():返回得到向量的第一个元素的数据

v1.back():返回得到向量的最后一个元素的数据

v1.size():返回得到向量中元素的个数

v1.push_back(数据):将数据插入到向量的尾部

v1.pop_back():删除向量尾部的数据

v1.push_front(数据):在开始位置增加一个数据。

v1.pop_front():删除第一个元素。

v1.assign(n,num):将n个num拷贝赋值给数组v1(数组原有的信息被覆盖)

v1.assign(v2.begin(),v2.end()):将[beg,end)一个左闭右开区间的数据赋值给v1

也可以用数组直接赋值(beginend是表示地址

int a[5] = {1,2,3,4,5};

list<int> a1;

a1.assign(a,a+5);

v1=v2

v1.at(index):传回索引为index的数据,如果index越界,抛出out_of_range异常。

v1.max_size():返回数组v1可能容纳的最大元素数量

v1.insert(pos,num):在pos位置(地址)插入元素num。

v1.insert(pos,n,num):在pos位置(地址)插入n个元素num。

v1.insert(pos,beg,end):在pos位置(地址)插入区间为[beg,end)的元素。

swap(v1.v2):交换两个数组

deque的遍历方式

1.数组下标。2.迭代器(逆向迭代器)。3.at函数

	#include <iostream>
	#include <vector>
	#include <list>
	#include <deque>
	
	using namespace std;
	
	int main(void)
	{
	    deque<int> vec;
	
	    vec.push_back(1);
	    vec.push_back(2);
	    vec.push_back(3);
	    vec.push_back(4);
	    vec.push_back(5);
	
	    cout << "向量的大小:" << vec.size() << endl;
	
	    // 数组下标方式遍历vector
	    for (int i = 0; i < vec.size(); i++)
	        cout << vec[i] << " ";
	    cout << endl;
	
	    // 迭代器方式遍历vector
	    deque<int>::iterator itor = vec.begin();
	    for (; itor != vec.end(); itor++)
	        cout << *itor << " ";
	    cout << endl;
	
	     //set()方式
	     for(int i=0;i<vec.size();i++)
		   cout<<vec.at(i);

	    return 0;
	}

deque的所有函数

1.deque的构造函数

deque<T> deqT;//默认构造形式

deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。

deque(n, elem);//构造函数将 n 个 elem 拷贝给本身。

deque(const deque &deq);//拷贝构造函数

2.deque的赋值函数

assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。

assign(n, elem);//将 n 个 elem 拷贝赋值给本身。

deque& operator=(const deque &deq); //重载等号操作符

swap(deq);// 将deq与本身的元素互换

3.deque的大小

deque.size();//返回容器中元素的个数

deque.empty();//判断容器是否为空

deque.resize(num);//重新指定容器的长度为 num,若容器变长, 则以默认值新位置。 如果容器变短, 则末尾超出容器长度的元素被删除。

deque.resize(num, elem); //重新指定容器的长度为 num,若容器变长, 则以 elem 值填充新位置,如果容器变短, 则末尾超出容器长度的元素被删除。

4.deque的插入和删除

push_back(elem);//在容器尾部添加一个数据

push_front(elem);//在容器头部插入一个数据

pop_back();//删除容器最后一个数据

pop_front();//删除容器第一个数据

5.deque的数据存取

at(idx);//返回索引 idx 所指的数据, 如果 idx 越界, 抛出 out_of_range。

operator[];//返回索引 idx 所指的数据, 如果 idx 越界, 不抛出异常, 直接出错。

front();//返回第一个数据。

back();//返回最后一个数据

6.deque的插入函数

insert(const_iterator pos,elem);//在 pos 位置插入一个 elem 元素的拷贝, 返回新数据的位置。

insert(const_iterator pos,n,elem);//在 pos 位置插入 n 个 elem 数据, 无返回值。

insert(const_iterator pos,const_iterator beg,const_iterator end);//在 pos 位置插入[beg,end)区间(可以是自己的区间也可以是别的deque的区间)的数据, 无返回值。

7.deque的删除函数

clear();//移除容器的所有数据

erase(const_iterator beg,const_iterator end);//删除[beg,end)区间的数据, 返回下一个数据的位置。

erase(const_iterator pos);//删除 pos 位置的数据, 返回下一个数据的位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值