C++ 17 deque容器

目录

一、deque容器

1.1 简介

1.2 构造函数

1.3 赋值操作

1.4 大小操作

1.5 插入和删除

1.6 数据存取

1.7 排序


一、deque容器

1.1 简介

① 功能:双端数组,可以对头端进行插入删除操作,也可以对尾端进行插入和删除操作。

② deque与vector区别:

  1. vector对于头部的插入效率低,数据量越大,效率越低,例如头部后有十万个数据,则往头部插入一个数据时,十万个数据都需要往后挪一挪才能在头部插入数据。
  2. deque相对而言,对头部的插入删除速度会比vector快
  3. vector访问元素时的速度会比deque快,这和两者内部实现有关。

C++ 17 deque容器_第1张图片 

 

③ deque内部工作原理:

  1. deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据。
  2. 中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间。

C++ 17 deque容器_第2张图片

④ deque容器的迭代器也是支持随机访问的。

1.2 构造函数

① 功能描述:deque容器构造。

② 函数原型:

  1. dequedeqT; //默认构造形式
  2. 构造函数将[beg,end)区间中的元素拷贝给本身。
  3. deque(n,elem); //构造函数将n个elem拷贝给本身
  4. deque(const deque &deq); //拷贝构造函数

③ deque荣哪个器和vector容器的构造方式几乎一致,灵活使用即可。

 

#include 
using namespace std;
#include 

//deque容器 构造函数

void printDeuque(const deque& d) //const 防止进行写操作,只能进行读
{
    for (deque::const_iterator it = d.begin(); it != d.end(); it++)  //表示只读迭代器
    {
        //*it = 100;   const使得当进行写操作时,会报错,会提示,避免了进行修改操作
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    dequed1; //无参构造函数

    for (int i = 0; i < 10; i++)
    {
        d1.push_back(i);
    }
    printDeuque(d1);

    //区间的方式构造
    dequed2(d1.begin(),d1.end());
    printDeuque(d2);

    //n个值的方式构造
    dequed3(10,100);
    printDeuque(d3);
    
    //拷贝构造
    dequed4(d3);
    printDeuque(d4);
}

int main()
{
    test01();

    system("pause");

    return 0;
}
运行结果:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100
请按任意键继续. . .

1.3 赋值操作

① 功能描述:给deque容器进行赋值。

② 函数原型:

  1. deque& operator=(const deque &deq); //重载等号操作符
  2. assign(beg, end); //将[beg,end)区间中的数据拷贝赋值给本身。
  3. assign(n,elem); //将n个elem拷贝赋值给本身。

③ deque赋值操作与vector相同。

#include 
using namespace std;
#include 

//deque容器 赋值操作

void printDeuque(const deque&d) 
{
    for (deque::const_iterator it = d.begin(); it != d.end(); it++)  //表示只读迭代器
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    dequed1; 

    for (int i = 0; i < 10; i++)
    {
        d1.push_back(i);
    }
    printDeuque(d1);

    //operator= 赋值
    dequed2;
    d2 = d1;
    printDeuque(d2);

    //assign 赋值
    dequed3;
    d3.assign(d1.begin(), d1.end());
    printDeuque(d3);
    
    dequed4(10,100);
    printDeuque(d4);
}

int main()
{
    test01();

    system("pause");

    return 0;
}
运行结果:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
100 100 100 100 100 100 100 100 100 100
请按任意键继续. . .

1.4 大小操作

① 功能描述:对deque容器的大小进行操作。

② 函数原型:

//判断容器是否为空

deque.empty();

//返回容器中的元素的个数

deque.size();

//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

deque.resize(num);

//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

deque.resize(num,elem);

#include 
using namespace std;
#include 

//deque容器 大小操作

void printDeuque(const deque&d) 
{
    for (deque::const_iterator it = d.begin(); it != d.end(); it++)  //表示只读迭代器
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    dequed1; 

    for (int i = 0; i < 10; i++)
    {
        d1.push_back(i);
    }
    printDeuque(d1); 

    if (d1.empty())
    {
        cout << "d1为空" << endl;
    }
    else
    {
        cout << "d1不为空" << endl;
        cout << "d1的大小为:" << d1.size() << endl;
        //deque容器没有容量概念
    }
    //重新指定大小
    d1.resize(15, 1); //这里指定填充值为1,如果没有第二个参数,默认的填充值为0
    printDeuque(d1);

    d1.resize(5);
    printDeuque(d1);
}

int main()
{
    test01();

    system("pause");

    return 0;
}
运行结果:

0 1 2 3 4 5 6 7 8 9
d1不为空
d1的大小为:10
0 1 2 3 4 5 6 7 8 9 1 1 1 1 1
0 1 2 3 4
请按任意键继续. . .

1.5 插入和删除

① 功能描述:向deque容器中插入和删除数据。

② 函数原型:

两端插入操作:

  1. push_back(elem); //在容器尾部添加一个数据
  2. push_front(elem); //在容器头部插入一个数据
  3. pop_back(); //删除容器最后一个数据
  4. pop_front(); //删除容器第一个数据

指定位置操作:

  1. insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
  2. insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值
  3. insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值
  4. clear(); //清空容器的所有数据
  5. erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
  6. erase(pos); //删除pos位置的数据,返回下一个数据的位置。
#include 
using namespace std;
#include 

//deque容器 插入和删除

void printDeuque(const deque&d) 
{
    for (deque::const_iterator it = d.begin(); it != d.end(); it++)  //表示只读迭代器
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    dequed1; 
    
    //尾插
    d1.push_back(10);
    d1.push_back(20);

    //头插
    d1.push_front(100);
    d1.push_front(200);
    
    printDeuque(d1);

    //尾删
    d1.pop_back();
    printDeuque(d1);

    //头删
    d1.pop_front();
    printDeuque(d1);
}

void test02()
{
    dequed2;
    d2.push_back(10);
    d2.push_back(20);
    d2.push_front(100);
    d2.push_front(200);

    printDeuque(d2);

    d2.insert(d2.begin(), 1000);
    printDeuque(d2);

    d2.insert(d2.begin(), 2, 9999);
    printDeuque(d2);

    dequed3;
    d3.push_back(1);
    d3.push_back(2);
    d3.push_front(3);

    d3.insert(d3.begin(), d2.begin(), d2.end()); //在d3.begin()的位置,插入区间d2.begin()-d2.end()之间的数
    printDeuque(d3);

}

void test03()
{
    dequed1;
    d1.push_back(10);
    d1.push_back(20);
    d1.push_front(100);
    d1.push_front(200);

    //删除
    deque::iterator it = d1.begin();
    it++;
    d1.erase(it); //d1.erase()为删除所有;d1.clear()也为清空容器所有数据
    printDeuque(d1);

    //按区间方式删除
    d1.erase(d1.begin(), d1.end());
    printDeuque(d1);

}

int main()
{
    test01();
    test02();
    test03();

    system("pause");

    return 0;
}
运行结果:

200 100 10 20
200 100 10
100 10
200 100 10 20
1000 200 100 10 20
9999 9999 1000 200 100 10 20
9999 9999 1000 200 100 10 20 3 1 2
200 10 20
空
请按任意键继续. . .

1.6 数据存取

① 功能描述:对deque中的数据的存取操作。

② 函数原型:

  1. at(int idx); //返回索引idx所指的数据
  2. operator[]; //返回索引idx所指的数据
  3. front(); //返回容器中第一个数据元素
  4. back(); //返回容器中最后一个数据元素

③ 除了用迭代器获取deque容器中元素,[]和at也可以。

#include 
using namespace std;
#include 

//deque容器 数据存取

void printDeuque(const deque&d) 
{
    for (deque::const_iterator it = d.begin(); it != d.end(); it++)  //表示只读迭代器
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    dequed1; 
    
    //尾插
    d1.push_back(10);
    d1.push_back(20);
    d1.push_back(30);

    //头插
    d1.push_front(100);
    d1.push_front(200);
    d1.push_front(300);

    //通过[]方式访问元素
    //
    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;
}
运行结果:

300 200 100 10 20 30
300 200 100 10 20 30
第一个元素为:300
最后一个元素为:30
请按任意键继续. . .

1.7 排序

① 利用算法实现对deque容器进行排序。

② 算法:

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

③ sort算法非常实用,使用时包含头文件algorithm即可。

#include 
using namespace std;
#include 
#include  //标准算法头文件

//deque容器 排序操作

void printDeuque(const deque&d) 
{
    for (deque::const_iterator it = d.begin(); it != d.end(); it++)  //表示只读迭代器
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    dequed1; 
    
    //尾插
    d1.push_back(10);
    d1.push_back(20);
    d1.push_back(30);

    //头插
    d1.push_front(100);
    d1.push_front(200);
    d1.push_front(300);

    printDeuque(d1);

    //排序  默认排序规则  从小到大 升序
    //对于支持随机访问的迭代器的容器,都可以利用sort算法直接对其进行排序
    //vector容器也可以利用sort进行排序
    sort(d1.begin(), d1.end());
    cout << "排序后:" << endl;
    printDeuque(d1);
}


int main()
{
    test01();

    system("pause");

    return 0;
}
运行结果:

300 200 100 10 20 30
排序后:
10 20 30 100 200 300
请按任意键继续. . .

你可能感兴趣的:(C++,c++,算法,数据结构)