C++学习 --- STL常用容器之deque容器

3、deque 容器

3.1、deque 容器基本概念
  • 功能:

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

  • deque和 vector区别:

vector对于头部的插入删除效率低,数据量越大,效率越低。

deque相对而言,对头部的插入删除速度会比vector快。

vector访问元素时的速度会比deque快,这和两者内部实现有关。

 

  • deque内部工作原理:

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

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

     

     

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

3.2、deque 构造函数

#include <iostream>
#include <deque>
using namespace std;
​
/*
deque<T> deqT;            //默认构造形式
deque(beg,end);           //构造函数将[beg,end)区间的元素拷贝给本身
deque(n.elem);            //构造函数将n个elem拷贝给本身
deque(const deque &deq);  //拷贝构造函数
*/
void printDeque(const deque<int> &d) {
    for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
        //*it = 100; // 加const 防止修改和 const_iterator 遍历容器中的数据
        cout << *it << " ";
    }
    cout << endl;
}
​
void test01() {
    deque<int> d1;
    for (int i = 0; i < 10; i++) {
        d1.push_back(i);
    }
    printDeque(d1);
​
    deque<int> d2(d1.begin(),d1.end());
    printDeque(d2);
​
    deque<int> d3(10, 100);
    printDeque(d3);
​
    deque<int> d4(d3);
    printDeque(d4);
}
​
​
​
int main() {
    test01();
    system("pause");
​
    return 0;
}
3.3、deque 赋值操作

#include <iostream>
using namespace std;
#include <deque>/*
deque & operator=(const deque &deq); //重载等号操作符
assign(beg,end);                     //将[beg,end)区间中的数据拷贝赋值给本身
assign(n,elem);                      //将n个elem拷贝赋值给本身
*/
//deque 容器的赋值操作
void printDeque(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;
    for (int i = 0; i < 10; i++) {
        d1.push_back(i);
    }
    printDeque(d1);
​
    // operator= 赋值
    deque<int> d2 = d1;
    printDeque(d2);
​
    //assign 赋值
    deque<int> d3;
    d3.assign(d1.begin(), d1.end());
    printDeque(d3);
​
    deque<int> d4;
    d4.assign(10,100);
    printDeque(d4);
}
​
int main() {
    test01();
    system("pause");
​
    return 0;
}
3.4、deque 大小操作

deque中没有capacity容器,因为他的容量是不受限制的

#include <iostream>
using namespace std;
#include <deque>/*
deque.empty();    //判断容器是否为空
deque.size();     //返回容器中元素的个数
deque.resize(num); //重新指定容器的长度为num,若容器长度较长,则以默认值0填充新位置。
    //如果容器变短,则末尾超出容器长度的元素被删除
deque.resize(num,elem);//重新指定容器的长度为num,若容器边长,则以elem值填充新位置。
    //如果容器变短,则末尾超出长度的元素被删除
*/
//deque 容器的大小操作
void printDeque(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;
    for (int i = 0; i < 10; i++) {
        d1.push_back(i);
    }
    printDeque(d1);
​
    if (d1.empty()) {
        cout << "d1 为空" << endl;
    }
    else
    {
        cout << "d1 不为空" << endl;
        cout << "d1 的大小为: " << d1.size() << endl;
        //deque 容器没有容量概念,因为他是无限的
    }
​
    //重新指定大小,默认是0
    //d1.resize(16);
    //printDeque(d1);
//重新指定大小,设定初始值为1
    //d1.resize(16,1);
    //printDeque(d1);
//缩短大小,超出的部分会被删除
    d1.resize(5);
    printDeque(d1);
}
​
int main() {
    test01();
    system("pause");
​
    return 0;
}
3.5、deque 插入和删除

#include <iostream>
using namespace std;
#include <deque>/*
push_back(elem);     //在容器尾部添加一个数据
push_front(elem);    //在容器头部插入一个数据
pop_back(); //删除容器最后一个数据
pop_front();//删除容器第一个数据
​
insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置
insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值
clear();        //清空容器的所有数据
erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置
erase(pos);     //删除pos位置的数据,返回下一个数据的位置
​
*///deque容器的插入和删除
void printDeque(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;
    //尾插
    d1.push_back(10);
    d1.push_back(20);
​
    //头插
    d1.push_front(100);
    d1.push_front(200);
    //200 100 10 20
    printDeque(d1);
​
    //尾删
    d1.pop_back();
    //200 100 10
    printDeque(d1);
​
    //头删
    d1.pop_front();
    //100 10
    printDeque(d1);
}
​
void test02() {
    deque<int> d1;
    d1.push_back(10);
    d1.push_back(20);
    d1.push_front(100);
    d1.push_front(200);
​
    //200 100 10 20
    printDeque(d1);
​
    //指定的位置插入一个数
    d1.insert(d1.begin(), 1000);
    //1000 200 100 10 20
    printDeque(d1);
    //指定的位置插入两个数
    d1.insert(d1.begin(),2,2000);
    //2000 2000 1000 200 100 10 20
    printDeque(d1);
​
    //按照区间进行插入
    deque<int> d2;
    d2.push_back(1);
    d2.push_back(2);
    d2.push_back(3);
​
    d1.insert(d1.begin(),d2.begin(),d2.end());
    //1 2 3 2000 2000 1000 200 100 10 20
    printDeque(d1);
}
​
void test03() {
    deque<int> d1;
    d1.push_back(10);
    d1.push_back(20);
    d1.push_front(100);
    d1.push_front(200);
    printDeque(d1);
    //删除
    deque<int>::iterator it = d1.begin();
    it++; //迭代器偏移删除指定的位置
    d1.erase(it);
    //200 10 20
    printDeque(d1);
​
    //按照区间方式删除
    //d1.erase(d1.begin(),d1.end());
    //清空    
    d1.clear();
    printDeque(d1);
}
​
int main() {
    test01();
    test02();
    test03();
    system("pause");
​
    return 0;
}

3.6、deque 数据存取

#include <iostream>
#include <deque>
using namespace std;
​
/*
at(int idx); //返回索引idx所指的数据
operator[];  //返回索引idx所指的数据
front();     //返回容器中第一个数据元素
back();      //返回容器中最后一个数据元素
*/
//deque 容器的数据存取操作
void test01() {
    deque<int> d1;
    d1.push_back(10);
    d1.push_back(20);
    d1.push_back(30);
    d1.push_front(100);
    d1.push_front(200);
    d1.push_front(300);
​
    //通过中括号的方式访问元素
    //300 200 100 10 20 30
    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;
}

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

3.7、deque 排序

#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;
​
/*
sort(iterator beg,iterator end);//对beg和end区间内元素进行排序,由STL提供
*///deque容器的排序
void printDeque(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;
    d1.push_back(10);
    d1.push_back(20);
    d1.push_back(30);
    d1.push_front(100);
    d1.push_front(200);
    d1.push_front(300);
​
    //300 200 100 10 20 30
    printDeque(d1);
​
    //排序 ,默认升序,从小到大
    //对于支持随机访问的迭代器的容器,都可以利用sort算法直接对其进行排序
    //vector容器也可以利用sort进行排序
    sort(d1.begin(), d1.end());
    //10 20 30 100 200 300
    printDeque(d1);
}
​
int main() {
    test01();
    system("pause");
    return 0;
}

总结:sort算法非常实用,使用时包含头文件algorithm 。

 

posted @ 2021-10-10 22:15  yiwenzhang  阅读(162)  评论(0编辑  收藏  举报