C++ deque容器的具体使用

deque 是 double-ended queue 的缩写,又称双端队列容器。

和 vector 不同的是,deque 还擅长在序列头部添加或删除元素,所耗费的时间复杂度也为常数阶O(1)。并且更重要的一点是,deque 容器中存储元素并不能保证所有元素都存储到连续的内存空间中。

当需要向序列两端频繁的添加或删除元素时,应首选 deque 容器。

deque容器的构造函数

//deque和vector的区别
//deque对于头部的插入和删除效率低,数据量越大,效率越低
//deque相对而言,对于头部的插入和删除比vector快
//deque访问元素时的速度比vector要慢,和两者的内部实现有关
#include <iostream>
#include <deque>
using namespace std;

void test01()
{
 deque<int>q;
}

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

创建deque容器的几种方式

创建 deque 容器,根据不同的实际场景,可选择使用如下几种方式。

1) 创建一个没有任何元素的空 deque 容器:

std::deque<int> d;

和空 array 容器不同,空的 deque 容器在创建之后可以做添加或删除元素的操作,因此这种简单创建 deque 容器的方式比较常见。

2) 创建一个具有 n 个元素的 deque 容器,其中每个元素都采用对应类型的默认值:

std::deque<int> d(10);

此行代码创建一个具有 10 个元素(默认都为 0)的 deque 容器。

3) 创建一个具有 n 个元素的 deque 容器,并为每个元素都指定初始值,例如:

std::deque<int> d(10, 5)

如此就创建了一个包含 10 个元素(值都为 5)的 deque 容器。

4) 在已有 deque 容器的情况下,可以通过拷贝该容器创建一个新的 deque 容器,例如:

std::deque<int> d1(5);
std::deque<int> d2(d1);

注意,采用此方式,必须保证新旧容器存储的元素类型一致。

5) 通过拷贝其他类型容器中指定区域内的元素(也可以是普通数组),可以创建一个新容器,例如:

//拷贝普通数组,创建deque容器
int a[] = { 1,2,3,4,5 };
std::deque<int>d(a, a + 5);
//适用于所有类型的容器
std::array<int, 5>arr{ 11,12,13,14,15 };
std::deque<int>d(arr.begin()+2, arr.end());//拷贝arr容器中的{13,14,15}

deque函数的赋值操作

deque<int>d1;

//直接赋值
for(int i=0;i<5;i++)
{
d1.pushback(i);
}

//拷贝赋值
deque<int>d2;
d2=d1;

//assign赋值
deque<int>d3;
d3.assign(d1.begin(),d1.end());//从头到尾拷贝

//批量赋值
deque<int>d4;
d4.assign(6,8);//赋值6个8给d4
deque的容量大小操作

//给容器赋一定的值
void DequePrint(Dequeint>&d1)
{
 for (Deque<int>::iterator it = d1.begin(); it < d1.end(); it++)
 {
  cout << *it << " ";
 }
 cout << endl;
}

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

 cout << "v1的容量为:"<<d1.capacity() << endl;
 cout << "v1的大小为:" << d1.size() << endl;

 //resize重新定义数组大小
 d1.resize(15);//原先大小为10的空间,变成15后,默认补0
 DequePrint(v1);

 d1.resize(15.520);//也可以自定义默认补的数
 DequePrint(v1);

 d1.resize(5);//当重新定义数组的大小比原先小的时候,会删除多余的数
 VDequePrint(v1);
}

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

deque容器的插入和删除

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

void DequePrint(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;

 //push插入  pop删除   front头    back尾
 //尾插
 d1.push_back(3);
 d1.push_back(4);
 DequePrint(d1);
 //头插
 d1.push_front(2);
 d1.push_front(1);
 DequePrint(d1);
 //尾删
 d1.pop_back();
 DequePrint(d1);
 //头删
 d1.pop_front();
 DequePrint(d1);

 //insert迭代器插入
 d1.insert(d1.begin(), 0);//头部插入
 DequePrint(d1);

 d1.insert(d1.end(), 4);//头部插入
 DequePrint(d1);

 //批量插入
 d1.insert(d1.begin(),3,0);//头部插入
 DequePrint(d1);

 //区间插入
 deque<int>d2;
 d2.push_front(1);
 d2.push_front(2);
 d2.push_front(3);
 DequePrint(d2);
 d2.insert(d2.begin(), d1.begin(), d1.end());//在头部出入d1区间
 DequePrint(d2);

 //删除第一个元素
 d2.erase(d2.begin());
 DequePrint(d2);
 //删除最后一个元素
 //d2.erase(d2.end());
 //DequePrint(d2);//进行最后一个元素删除时报错,不知道什么原因

 //删除中间指定元素
 deque<int>::iterator it = d2.begin();
 it++;
 d2.erase(it);
 DequePrint(d2);

 //区间删除
 d2.erase(d2.begin(), d2.end());
 DequePrint(d2);

}

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

deque容器的排序操作

#include <iostream>
#include<deque>
#include<algorithm>//sort的头文件
using namespace std;

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

void test01()
{
 deque<int>d1;
 d1.push_back(1);
 d1.push_back(2);
 d1.push_back(3);
 d1.push_front(4);
 d1.push_front(5);
 d1.push_front(6);
 DequePrint(d1);

 //sort排序   从小到大
 sort(d1.begin(), d1.end());
 DequePrint(d1);
}

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

deque容器的存取操作

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

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

 //通过[]进行访问
 for (int i = 0; i < d1.size(); i++)
 {
  cout << d1[i] << " ";
 }
 cout << endl;

 //通过at进行访问
 for (int i = 0; i < d1.size(); i++)
 {
  cout << d1.at(i) << " ";
 }
 cout << endl;

 //获取第一个元素
 cout << d1.front() << endl;

    //获取最后一个元素
 cout << d1.back() << endl;
}

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

到此这篇关于C++ deque容器的具体使用的文章就介绍到这了,更多相关C++ deque容器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ STL入门教程(3) deque双向队列使用方法

    一.简介 deque(Double Ended Queues,双向队列)和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样). 二.完整程序代码 /*请务必运行以下程序后对照阅读*/ #include <deque> #include <iostream> #include <algorithm> #include <stdexcept> using namespace std; void print(int num) { cout <&

  • 深入分析C++中deque的使用

    首先,当考虑到内存分配和执行性能的时候,使用std::deque要比std::vector好. Deque总览 deque和vector一样都是标准模板库中的内容,deque是双端队列,在接口上和vector非常相似,在许多操作的地方可以直接替换.假如读者已经能够有效地使用vector容器,下面提供deque的成员函数和操作,进行对比参考. 函数 描述 c.assign(beg,end)c.assign(n,elem)  将[beg; end)区间中的数据赋值给c.将n个elem的拷贝赋值给c.

  • C++ deque容器的具体使用

    deque 是 double-ended queue 的缩写,又称双端队列容器. 和 vector 不同的是,deque 还擅长在序列头部添加或删除元素,所耗费的时间复杂度也为常数阶O(1).并且更重要的一点是,deque 容器中存储元素并不能保证所有元素都存储到连续的内存空间中. 当需要向序列两端频繁的添加或删除元素时,应首选 deque 容器. deque容器的构造函数 //deque和vector的区别 //deque对于头部的插入和删除效率低,数据量越大,效率越低 //deque相对而言

  • C++ deque容器的用法详解

    deque(双端队列)是由一段一段的定量连续空间构成,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速. 在中间部分安插元素则比较费时,因为必须移动其它元素. deque容器的构造函数 //deque和vector的区别 //deque对于头部的插入和删除效率低,数据量越大,效率越低 //deque相对而言,对于头部的插入和删除比vector快 //deque访问元素时的速度比vector要慢,和两者的内部实现有关 #include <iostream> #include <deq

  • C++Primer笔记之顺序容器的使用详解

    顺序容器,它将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,这就是顺序容器.标准库里定义了三种类型:vector(支持快速随机访问).list(支持快速插入.删除).deque(双端队列)容器只定义了少量操作,大多数额外的操作由算法库提供.容器内元素的类型约束:1.元素类型必须支持赋值运算:2.元素类型的对象必须可以复制.这是容器元素类型的最低要求,如果想支持一些其他特殊要求,则必须具备相关的性质. 可以定义容器的容器vector< vector<int> > l

  • C++ STL入门教程(1) vector向量容器使用方法

    一.简介 Vectors 包含着一系列连续存储的元素,其行为和数组类似. 访问Vector中的任意元素或从末尾添加元素都可以在O(1)内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是O(N). 二.完整程序代码 /*请务必运行以下程序后对照阅读*/ #include <vector> #include <iostream> #include <algorithm> #include <stdexcept> using namespace

  • c++中容器之总结篇

    C++中的容器大致可以分为两个大类:顺序容器和关联容器.顺序容器中有包含有顺序容器适配器. 顺序容器:将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素.主要有vector.list.deque(双端队列).顺序容器适配器:stack.queue和priority_queue. 关联容器:支持通过键来高效地查找和读取元素.主要有:pair.set.map.multiset和multimap. 接下来依次对于各种容器做详细的介绍. 一.顺序容器 1.顺序容器定义 为了定义一个容器类型

  • c++容器list、vector、map、set区别与用法详解

    c++容器list.vector.map.set区别 list 封装链表,以链表形式实现,不支持[]运算符. 对随机访问的速度很慢(需要遍历整个链表),插入数据很快(不需要拷贝和移动数据,只需改变指针的指向). 新添加的元素,list可以任意加入. vector 封装数组,使用连续内存存储,支持[]运算符. 对随机访问的速度很快,对头插元素速度很慢,尾插元素速度很快 新添加的元素,vector有一套算法. map 采用平衡检索二叉树:红黑树 存储结构为键值对<key,value> set 采用

  • C++ STL容器适配器使用指南

    目录 适配器 stack容器适配器 ️stack的介绍 ️stack的使用 ️stack的模拟实现 queue ️queue的介绍 ️queue的使用 ️queue的模拟实现 deque容器 priority-queue ️priority-queue的使用 ️priority-queue的模拟实现 适配器 适配器是一种设计模式(设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口.例如: 容器适配器让一种已存在的容

  • C++ primer超详细讲解顺序容器

    目录 顺序容器概述 容器库概览 迭代器 容器定义和初始化 赋值和swap 顺序容器操作 向顺序容器添加元素 访问元素 删除元素 特殊的forwa_list单向链表操作 改变容器大小 vector对象是如何增长的 定义:一个容器就是一个特定类型对象的集合. 顺序容器概述 (1)顺序容器类型 vector:可变数组大小,支持快速访问 deque:双端队列,支持快速随机访问,在头尾位置插入/删除速度很快 forward_list:单向链表,只支持单向顺序访问. array:固定大小数组,不能添加或删除

  • C++容器适配器的概念与示例

    目录 一. 什么是适配器与容器适配器? 二. 理解容器适配器 stack的模拟实现 queue的模拟实现 一. 什么是适配器与容器适配器? 适配器是一种设计模式(设计模式是一套被反复使用的,多数人知晓的,经过分类编目的,代码设计经验的总结),该种模式将一个类的接口转换成用户需要的另外一个接口. 举个例子:在日常生活中,当手机没电了,我们需要给手机充电,给手机充电的方式很多,可以插到电源上,也可以用充电宝,还可以直接连着电脑充.而我们并不关心用什么给它充电,我们关心的只是能否给手机充上电.适配器充

  • 深入理解C++中的vector类的用法及特性

    //<vector> template < class T, class Alloc = allocator<T> > class vector; 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence container).跟任意其它类型容器一样,它能够存放各种类型的对象.可以简单的认为,向量是一个能够存放任意类型的动态数组. vector类为内置数组提供了一种替代表示,与string类一样 vector 类是随标准 C++引入的标准库的一部分 ,为

随机推荐