欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STL容器之deque

程序员文章站 2024-02-11 17:05:58
...

目录

一、什么是deque

1、deque概念

2、deque与vector的区别

二、deque构造函数

三、deque常用接口

1、deque赋值操作

2、deque大小操作

3、deque插入和删除

4、deque数据存取和排序

一、什么是deque

1、deque概念

deque是双端数组,同时支持头部和尾部进行插入删除元素的操作,支持容器的遍历操作,支持迭代器的随机访问。

STL容器之deque

2、deque与vector的区别

1、vector虽说也可以利用insert()函数在头部插入数据,但效率会很低,因为插入时,需要把之后所有的元素往后挪位置,而且元素数量越大,效率会越低;

2、deque相对于vector而言,在头部插入就相当轻松,速度比vector快很多;

3、vector访问元素的速度比deque快,这与内部的实现有关系(deque内部有一个中控器)。

二、deque构造函数

1、默认无参构造函数;

2、参数为迭代器区间范围的构造函数,将区间范围内的元素拷贝给本身;

3、参数为N个相同元素的构造函数;

4、拷贝构造函数

void Constructor()
{
    qDebug() << "构造函数...";

    // 默认构造函数 deque<T> d
    deque<int> d;
    for( int i=0; i<5; i++ )
        d.push_back(i);
    Printfln(d);

    // 带迭代器区间范围的构造函数
    deque<int> d1(d.begin(), d.end());
    Printfln(d1);

    // 参数为N个相同元素的构造函数
    deque<int> d2(4, 666);
    Printfln(d2);

    // 拷贝构造函数
    deque<int> d3;
    d3 = d;
    Printfln(d3);

    qDebug() << "构造函数结束...";
}

三、deque常用接口

1、deque赋值操作

deque的赋值操作与vector是一样的三部曲:

(1)利用operator =()的操作赋值;

(2)利用assign函数重载实现赋值操作。

void OperatorTest()
{
    qDebug() << "赋值操作...";

    deque<int> d1;
    for( int i=0; i<10; i++ )
        d1.push_back(i);
    Printfln(d1);

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

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

    deque<int> d4;
    d4.assign(10, 666);
    Printfln(d4);

    qDebug() << "赋值操作结束...";
}

2、deque大小操作

在deque中是没有像vector容量的概念,毕竟是通过中控器去操作,可以向前或者向后无限的扩大内存,和deque大小有关的接口:

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

(2)deque.empty():获取容器中的元素个数;

(3)deque.resize(len)或者deque.reszie(len, element):

重新指定容器中的大小为len,如果重新指定后的长度比原来长,则默认0来填充,也可以利用element进行填充;如果重新指定后的长度比原来短,则舍弃后面的元素。

void SizeTest()
{
    qDebug() << "大小操作...";

    deque<int> d1;
    for( int i=0; i<10; i++ )
        d1.push_back(i);
    Printfln(d1);

    if( !d1.empty() )
    {
        qDebug() << "d1不为空!";

        qDebug() << "d1的大小: " << d1.size();
        d1.resize(15, 1);
        Printfln(d1);
    }
    else {
        qDebug() << "d1为空!";
    }

    qDebug() << "大小操作结束...";
}

3、deque插入和删除

void InsertDelete()
{
    deque<int> d;

    // 头部插入
    d.push_front(100);
    d.push_front(50);
    d.push_front(10);
    Printfln(d);
    // 头部删除
    d.pop_front();
    Printfln(d);

    // 尾部插入
    d.push_back(200);
    d.push_back(300);
    d.push_back(400);
    Printfln(d);
    // 尾部删除
    d.pop_back();
    Printfln(d);

    // erase()函数重载和clear()与vector相同
    // insert()函数重载插入与vector相同,这里就不测试了
}

4、deque数据存取和排序

(1)deque.at(index):获取索引为index的元素;

(2)operator[]():与原生数组一样,利用deque[index],返回索引为index的元素;

(3)front():返回容器中第一个元素;

(4)back():获取容器中最后一个元素。

(5)利用STL标准库算法sort(deque.begin(), deque.end())进行排序,需要包含头文件#include <algorithm>。

void DataSort()
{
    deque<int> d;
    d.push_back(200);
    d.push_back(100);
    d.push_front(10);
    d.push_front(50);
    Printfln(d);

    qDebug() << "容器中第一个元素: " << d.front();
    qDebug() << "容器中最后一个元素: " << d.back();

    sort(d.begin(), d.end());
    qDebug() << "排序后的d: ";
    Printfln(d);
}

 

相关标签: C++ stl c++ qt