deque

deque概念

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

deque和vector差别(就像数据结构中的栈和队列)

vector对于头部的插入删除效率低,而deque则相对高效

vector和deque都支持随机访问,但是vector的随机访问效率低,而deque则相对高效

vector和deque都支持迭代器,但是vector的迭代器效率低,而deque则相对高效

deque相对而言,对头部的插入删除操作会比vector快

deque内部工作原理

deque内部有个中控器,维护每段缓冲区的内容,缓冲区存放真实数据

中控器维护的是每个缓冲区的地址,使得deque像一片连续的内存空间

deque构造函数

deque<T>deqT;// 默认构造函数,创建一个空的deque

deque(beg,end);// 构造函数,创建一个区间[beg,end)区间的元素拷贝给本身

deque(n,elm);// 构造函数,创建一个长度为n的deque,每个元素都为elm

deque(const deque &deq);// 构造函数,创建一个deque的拷贝

cpp 复制代码
#include <iostream>
#include <deque>
using namespace std;

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

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

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

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

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

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

基本语法和vector类似

deque赋值操作

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

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

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

cpp 复制代码
、#include <iostream>
#include <deque>

using namespace std;

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

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

    deque<int> d2;
    d2=d1;
    printDeque(d2);

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

    deque<int> d4;
    d4.assign(10, 100);
    printDeque(d4);
}
int main()
{
    test();
    system("pause");
    return 0;
}

deque大小操作

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

deque.size();// 返回deque元素个数

deque.resize(num);// 调整deque元素个数,若小于num,则用默认值补充,若大于num,则删除末尾元素

deque.resize(num,value);// 调整deque元素个数,若小于num,则用value补充,若大于num,则删除末尾元素

deque.max_size();// 返回deque可容纳的最大元素个数

deque.clear();// 清空deque

cpp 复制代码
#include <iostream>
#include <deque>

using namespace std;

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

void test(){
    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的大小为:" << d1.size() << endl;
    }

    d1.resize(15,10);
    printDeque(d1);

    d1.resize(20);
    printDeque(d1);
}

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

deque插入和删除

push_back(elm);// 在队尾插入元素elm

push_frony(elm);// 在队首插入元素elm

pop_back();// 删除队尾元素

pop_front();// 删除队首元素

insert(pos,elm);// 在pos位置插入元素elm,返回新数据的位置

insert(pos,n,elm);// 在pos位置插入n个元素elm,无返回值

insert(pos,beg,end);// 在pos位置插入[beg,end)区间内的所有元素,无返回值

clear();// 清空deque

erase(beg,end);// 删除[beg,end)区间内的所有元素,返回删除区间最后一个元素的下一个位置

erase(pos);// 删除pos位置的元素,返回删除元素的下一个位置

cpp 复制代码
#include <iostream>
#include <deque>

using namespace std;

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

void test(){
    deque<int> d1;
    d1.push_back(10);
    d1.push_back(20);
    printDeque(d1);// 10 20

    d1.push_front(30);
    d1.push_front(40);
    printDeque(d1);// 40 30 10 20

    d1.pop_back();
    printDeque(d1);// 40 30 10
    d1.pop_front();
    printDeque(d1);// 30 10
}
int main()
{
    test();
    system("pause");
    return 0;
}

deque数据存取

at(int idx);//访问索引idx的元素,如果越界,则抛出异常

operator\[\](int idx);//访问索引idx的元素,如果越界,则返回0

front();//访问第一个元素

back();//访问最后一个元素

cpp 复制代码
#include <iostream>
#include <deque>

using namespace std;

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

void test(){
    deque<int> d;
    d.push_back(10);
    d.push_back(20);
    d.push_front(100);
    d.push_front(200);

    for(int i=0;i<d.size();i++){
        cout<<d[i]<<" ";
    }
    cout<<endl;

    for(int i=0;i<d.size();i++){
        cout<<d.at(i)<<" ";
    }
    cout<<endl;

    cout<<"front"<<d.front()<<endl;
    cout<<"back"<<d.back()<<endl;
}
int main()
{
    test();
    system("pause");
    return 0;
}

deque排序

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

cpp 复制代码
#include <iostream>
#include <deque>
#include<algorithm>

using namespace std;

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

void test(){
    deque<int> d;
    d.push_back(10);
    d.push_back(20);
    d.push_front(100);
    d.push_front(200);

    printDeque(d);//200 100 10 20
    sort(d.begin(),d.end());
    printDeque(d);//10 20 100 200
}

int main()
{
    test();
    system("pause");
    return 0;
}
相关推荐
折哥的程序人生 · 物流技术专研13 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
玖玥拾14 小时前
C/C++ 基础笔记(十四)多态与模板编程
c语言·c++·多态·模板
想吃火锅100514 小时前
【leetcode】14.最长公共前缀js
算法·leetcode·职场和发展
Roann_seo%14 小时前
C++文件操作完全指南:从文本读写到二进制文件处理
开发语言·c++
坚果派·白晓明15 小时前
【鸿蒙PC】SDL3 适配:AtomCode + Skills 快速集成 NAPI 测试工具
c++·华为·ai编程·harmonyos·atomcode
云絮.15 小时前
数据库操作
数据库·mysql·算法·oracle
小林ixn16 小时前
LeetCode 206. 反转链表(迭代 + 递归详解)
算法·leetcode·链表
凡人叶枫16 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
凡人叶枫17 小时前
Effective C++ 条款16:成对使用 new 和 delete 时要采取相同形式
开发语言·c++·effective c++
菜鸟‍17 小时前
LeetCode 1 27 和 704 || 两数之和 移除元素 二分查找
算法·leetcode·职场和发展