C++进阶-STL deque容器的简单认识

STL deque容器的简单认识

    • deque容器的基本概念
      • deque和vector的区别
      • deque内部工作原理:
    • deque容器构造函数
    • deque容器赋值操作
    • deque容器大小操作
    • deque容器插入和删除
    • deque容器数据存取
    • deque容器排序操作

deque容器的基本概念

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

deque和vector的区别

  • vector 对于头部的插入删除效率低,数据量越大,效率越低
  • deque相对而言,对头部的插入删除速度会比vector快
  • vector访问元素时的速度会比deque快,这和两者的内部实现有关

C++进阶-STL deque容器的简单认识_第1张图片

deque内部工作原理:

deque内部有一个中控器,维护每段缓冲区的内容,缓冲区中存放真实数据
中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间
C++进阶-STL deque容器的简单认识_第2张图片

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

deque容器构造函数

  • deque deq; 默认构造函数
deque<string> deq;
  • deque(bug, end); 构造函数将[beg, end)区间中的元素拷贝给本身
deque<string> deq;
deque<string> deq_copy(deq.begin(), deq.end());
  • deque(n, elem); 构造函数将n个elem拷贝给本身
deque<string> deq(3, 10);
  • deque(const deque& dep); 拷贝构造函数
deque<string> deq;
deque<string> deq_copy(deq);

deque容器赋值操作

  • deque& operator=(const deque& deq); 重载等号运算符
deque<int> deq;
for (int i = 0; i < 10; i++)
{
    deq.push_back(i);
}
print(deq);
deque<int> deq_2 = deq;
print(deq_2);
  • assign(beg, end); 将[beg, end) 区间内的数据拷贝赋值给本身
deque<int> deq;
for (int i = 0; i < 10; i++)
{
    deq.push_back(i);
}
print(deq);
deque<int> deq_2;
deq_2.assign(deq.begin(), deq.end());
print(deq_2);
  • assign(n, elem); 将n个elem拷贝赋值给本身
deque<int> deq;
deq.assign(10, 8);
print(deq);

deque容器大小操作

  • deque.empty(); 判断容器是否为空
deque<int> deq;
deq.assign(10, 8);
std::cout << "deq 是否为空" << deq.empty() << std::endl;
  • deque.size(); 返回容器中元素的个数
deque<int> deq;
deq.assign(10, 8);
std::cout << "deq 大小" << deq.size() << std::endl;
  • deque.resize(); 更新指定容器的长度num, 若容器变长,则以默认值填充新位置,若容器变短,则超出末尾的长度的元素将被删除
deque<int> deq;
deq.assign(10, 8);
deq.resize(5);
print(deq);

result

  • deque.resize(num, elem); 重新指定容器的长度num,若容器变长将以elem值填充新位置,如果容器变短,末尾超出部分将被删除
deque<int> deq;
deq.assign(10, 8);
deq.resize(15, 2);
print(deq);

jieguo

deque容器插入和删除

  • push_back(elem); 在容器尾部添加一个元素
deque<int> deq;
for (int i = 0; i < 10; i++)
{
    deq.push_back(i);
}
print(deq);
  • push_front(elem); 在容器头部插入一个元素
deque<int> deq;
for (int i = 0; i < 10; i++)
{
    deq.push_front(i);
}
print(deq);
  • pop_back(); 删除容器最后一个元素
deque<int> deq;
for (int i = 0; i < 10; i++)
{
  	deq.push_front(i);
}
deq.pop_back();
print(deq);
  • pop_front(); 删除容器第一个元素
deque<int> deq;
for (int i = 0; i < 10; i++)
{
  	deq.push_front(i);
}
deq.pop_front();
print(deq);
  • insert(pos, elem); 在pos位置插入一个elem元素的拷贝,返回新数据的位置
 deque<int> deq;
 deque<int>::iterator it = deq.insert(deq.begin(), 12);
 std::cout << *it << std::endl;
 print(deq);

在这里插入图片描述

  • insert(pos, n, elem); 在pos位置插入n个elem的元素,无返回值
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
print(deq);

在这里插入图片描述

  • insert(pos, deb, end); 在pos位置插入[beg, end) 区间的数据,无返回值
 deque<int> deq;
 deq.insert(deq.begin(), 4, 12);
 print(deq);
 deque<int> deq_2;
 deq_2.insert(deq_2.begin(), deq.begin(), deq.end());
 print(deq_2);
  • clear(); 清空容器的所有操作
 deque<int> deq;
 deq.insert(deq.begin(), 4, 12);
 print(deq);
 deq.clear();
 print(deq);
  • erase(beg, end); 删除[beg, end)区间的数据,返回下一个数据的位置
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
deq.erase(deq.begin(), deq.end());
print(deq);
  • erase(pos); 删除pos位置的数据,返回下一个数据的位置
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
deq.erase(deq.begin());
print(deq);

deque容器数据存取

  • at(int idx); 返回索引idx所指的数据
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
std::cout << deq.at(1) << std::endl;
  • operator[]; 返回索引idx所指的数据
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
std::cout << deq[1] << std::endl;
  • front(); 返回容器中的第一个元素
在deque<int> deq;
deq.insert(deq.begin(), 4, 12);
std::cout << deq.font() << std::endl;
  • back(); 返回容器中最后一个元素
在deque<int> deq;
deq.insert(deq.begin(), 4, 12);
std::cout << deq.back() << std::endl;

deque容器排序操作

  • sort(iterator beg, iterator end); 对beg和end区间内的元素进行排序
    默认排序是从小到大,即升序排列
#include 
#include 
#include 
#include 
using namespace std;

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

int main()
{
    srand((unsigned int)time(NULL));
    deque<int> deq;
    for (int i = 0; i < 10; i++)
    {
        int num = rand() % 60 + 40;
        deq.push_back(num);
    }
    std::cout << "排序前:" << std::endl;
    print(deq);
    sort(deq.begin(), deq.end());
    std::cout << "排序后:" << std::endl;
    print(deq);
}

运行结果
实际上,对于支持随机访问的迭代器,都可以利用sort算法进行排序,vector也可以使用sort排序

你可能感兴趣的:(C++入门与进阶内容专栏,c++,java,开发语言)