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;
}
相关推荐
亮剑20187 小时前
第2节:程序逻辑与控制流——让程序“思考”
开发语言·c++·人工智能
王璐WL7 小时前
【数据结构】单链表及单链表的实现
数据结构
敲代码的瓦龙7 小时前
操作系统?进程!!!
linux·c++·操作系统
TiAmo zhang7 小时前
现代C++的AI革命:C++20/C++23核心特性解析与实战应用
c++·人工智能·c++20
黑屋里的马7 小时前
java的设计模式之桥接模式(Bridge)
java·算法·桥接模式
z187461030037 小时前
list(带头双向循环链表)
数据结构·c++·链表
sin_hielo7 小时前
leetcode 1611
算法·leetcode
李小白杂货铺8 小时前
识别和破除信息茧房
算法·信息茧房·识别信息茧房·破除信息茧房·算法推荐型茧房·观点过滤型茧房·茧房
来荔枝一大筐8 小时前
C++ LeetCode 力扣刷题 541. 反转字符串 II
c++·算法·leetcode
报错小能手8 小时前
C++笔记——STL list
c++·笔记