0
点赞
收藏
分享

微信扫一扫

C++容器

他说Python 2022-01-12 阅读 145
c++容器

Deque

1. 功能

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

2. deque 和 vector 区别

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

3. deque 的实现原理

deque 内部有个 中控器,维护每段缓冲区的内容,缓冲区存放真实数据,中控器维护的是每个缓冲区的地址,使得使用 deque 时 像一片连续的内存空间
在这里插入图片描述

4. deque 构造函数

  • deque 容器构造

函数原型

  • deque<T> deq; // 默认构造形式
  • deque(beg, end); // 构造函数将 [beg, end] 区间中的元素拷贝给本身。
  • deque(n, elem); // 构造函数将n个elem拷贝给本身
  • deque(const deque& deq); // 拷贝构造函数

案例

void PriDeq(const deque<int>& deq)
{
    for (auto i : deq)
        cout << i << " ";
    cout << endl;
}

void test1()
{
    deque<int> d1;
    for (int i = 0; i < 10; i++) {
        d1.push_back(i);
    }
    PriDeq(d1);

    deque<int> d2(d1.begin(), d1.end());
    PriDeq(d2);

    deque<int> d3(10, 100);
    PriDeq(d3);

    deque<int> d4(d1);
    PriDeq(d4);
}

5. 插入和删除

函数原型

两端插入操作

  • push_back(elem); // 容器尾部添加一个数据
  • push_front(elem); // 容器头部添加一个数据
  • pop_back(); // 删除容器最后一个元素
  • pop_front(); // 删除容器第一个数组

指定位置操作

  • insert(pos, elem);
  • insert(pos, n, elem);
  • insert(pos, beg, end);
  • clear();
  • erase(beg, end);
  • erase(pos); // 删除pos位置的数据,返回下一个数据的位置

6. deque 数据存取

函数原型

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

7. deque 排序

函数原型

  • sort(iterator beg, iterator end) // 对区间内的元素进行排序,默认是升序

stack

  • stack 是一种先进后出的数据结构,它只是一个出口
  • 栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为

栈中进入数据称为 — 入栈
栈中弹出数据称为 — 出栈

stack 常用接口

功能描述:栈容器常用的对外接口

构造函数

  • stack<T> stk; // stack 采用模板类型,stack对象的默认构造形式
  • stack(const stack &stk); // 拷贝构造函数

赋值操作

  • stack& operator=(const stack &stk); // 重载等号操作符

数据存取

  • push(elem); // 向栈顶添加元素
  • pop(); // 从栈顶移除第一个元素
  • top(); // 返回栈顶元素

大小操作

  • empty();
  • size() // 返回栈的大小

queue 容器

概念:Queue 是一种先进先出的数据结构,它有两个出口

  • 队列容器允许从一端新增元素,从另一端移除元素
  • 队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为
  • 队列中在队尾进数据称为 — 入队push
  • 队列中在队头出数据称为 — 出队pop

queue 常用接口

构造函数

  • queue<T> que;
  • queue(const queue& que);

赋值操作

  • queue& operator=(const queue &que);

数据存取

  • push(elem) // 从队尾添加元素
  • pop(); // 从队头移除第一个元素
  • back()
  • front() // 返回第一个元素

大小操作

  • empty();
  • size(); // 返回队列的大小

list

将数据进行链式存储

  • 链表:是一种 物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针连接实现的
  • 链表由一系列 节点 组成,一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域
  • STL中的链表是一个双向链表 ,具有两个指针域,分别指向前一个指针域(prev)后一个指针域(next)

优点

  • 采用动态存储分配,不会造成内存浪费和溢出
  • 可以对任意位置进行快速插入和删除元素,修改指针即可,不需要移动大量元素

缺点

  • 容器遍历速度没有数组快
  • 占用数组的空间比数组大

总结:List 和 vector 是STL中最常被使用的容器

构造函数

  • list<T> lst;
  • list(beg, end);
  • list(n, elem);
  • list(const list& lst);

赋值和交换

  • assign(beg, end);
  • assign(n, elem);
  • list& operator=(const list &lst);
  • swap(lst);

list 大小操作

  • size();
  • empty();
  • resize(num);
  • resize(num, elem);

list 删除数据

  • remove(elem) // 删除容器中所有与 elem 值匹配的元素

数组存取

  • front();
  • back();

llist反转和排序

  • reverse(); // 反转链表
  • sort(); // 链表排序,默认 0 是升序,1 是降序
    1. 所有不支持随机访问迭代器的容器,不可以用标准算法
    2. 不支持随机访问迭代器的容器,内部会提欧共对应一些算法

案例

void prt(const list<int>& lst)
{
   for (auto i : lst)
       cout << i << " ";
   cout << endl;
}

bool Cmp(int a = 1, int b = 0)
{
   return a > b;
}

int main()
{
   list<int> lis;
   lis.push_back(10);
   lis.push_back(20);
   lis.push_back(30);
   prt(lis);

   lis.reverse();
   prt(lis);

   lis.sort();	// false 是升序
   prt(lis);

   lis.sort(Cmp);  // 降序 返回TRUE
   prt(lis);
}
举报

相关推荐

C/C++ -容器map

c++ 顺序容器

C++ vector 容器

C++——STL容器

C++ 容器操作

C++ 容器浅析

C++——顺序容器

c++ vector容器

【C++】list容器

0 条评论