C++ 学习笔记 2.1 : 容器和算法(顺序容器、关联容器、泛型算法)

来源:互联网 发布:触摸屏如何编程 编辑:程序博客网 时间:2024/05/07 05:12

1. 容器适配器

  • 三种顺序容器适配器:queuepriority_queuestack
  • 容器适配器:让一种已存在的容器类型采用另一种不同的抽象类型(stack 或 queue)的工作方式实现。
    • stack (栈)适配器可使任何一种顺序容器以栈的方式工作。
  • 使用适配器时,必须包含相关的头文件
    • #include <stack> // stack 适配器
    • #include <queue> // queue 和 priority_queue 适配器
  • 适配器通用的操作和类型
    • size_type : 一种类型,足以存储次适配器类型最大对象的长度。
    • value_type :元素类型
    • container_type : 基础容器的类型,适配器在此基础上实现
    • A a; 创建一个新的空适配器,命名为 a 。
    • A a(c); 创建一个名为 a 的新适配器,初始化为容器 c 的副本。
    • 关系操作符 所有适配器都支持全部关系操作符: ==、!= 、< 、<=、>、>= 。

2. 适配器初始化与基础容器:

  • 所有适配器都定义了两个构造函数:
    • 默认构造函数用于创建空对象。
      • stack <int> stk; // 创建一个空的 stack 适配器,默认基于 deque 容器实现。
    • 带一个“容器参数”的构造函数将参数容器的副本(复制完后与原参数容器无关)作为其基础值。
      • stack <int> stk(ivec); // deq 是 vector<int> 型容器,默认也是基于 deque 容器实现、只是复制 vector 容器类型内的元素。
  • 适配器实现的容器类型
    • 默认的 stak 和 queue 都是基于 deque 容器实现。
      • 可通过将一个顺序容器指定为适配器的第二个类型实参,以覆盖其关联的基础容器类型。
        • stack <string, vector<string> >str_stk; // 创建一个基于 vector 容器类型实现的 string 类型的空 stack 适配器。(彩色区域空格不能省)
        • stack <string, vectot<string> >str_stk2(svec); // 创建一个基于 vector 容器类型的 string 类型的 stack 适配器,stack 的内容为 svec 的副本。
    • priority_queue 则在 vector 容器上实现。
  • 适配器约束条件:
    • stack 适配器所关联的基础容器可以是任意一种顺序容器类型:
      • stack栈 (默认 deque 实现),可以建立在 vector、list 和 deque 容器之上
      • queue适配器(默认 deque 实现),要求必须提供 push_front 运算,只能建立在 list 和 deque 容器上。不能建立在 vector 上。
      • priority_queue 适配器(默认 vector 实现),要求必须提供快速随机访问,因此可建立在 vector 或 deque 容器上,不能建立在 list 容器上。

3.适配器与基础容器关系图:

4. 栈适配器

  • 使用 stack 栈,必须包含 stack 头文件: #includ <stack>
  • 栈适配器支持的操作
    • s.empty() : 如果栈为空,则返回 true,否则返回 false。
    • s.size() : 返回栈中元素的个数。
    • s.pop() : 删除栈顶元素,但不返回其值、
    • s.top() : 返回栈顶元素的值,但不删除该元素。
    • s.push(item) : 在栈顶压入新元素。
  • 因为 stack 栈适配器默认是以 deque 容器实现的,因此 stack 上面支持的操作都是采用 deque 提供的操作来实现 stack 栈的功能的
    • 尽管 stack 栈是以 deque 容器为基础实现的,并且栈是操作也是以 deque 的操作实现,但是程序员不能直接访问 deque 所提供的操作
      • 不能在 stack 栈上调用 deque 的相关函数:
        • 不能在栈上调用 push_back 操作,而是必须使用 栈 所提供的 push 操作。

5. 队列和优先级队列

  • 使用 queue 和 priority_queue 这两种队列,必须包含 queue 头文件: #include <queue>
  • 标准库队列 queue :
    • 进入队列的对象被放置在尾部。
    • 下一被取出的元素则取自队列的首部。
  • priority_queue 队列:
    • 允许用户为队列中存储的元素设置优先级。
    • 新进入的对象不是直接放在队尾,而是放在比它优先级低的元素前面。(最先取出的是优先级高的元素)
    • 下一被取出的元素依然是队列的首部的元素。
    • 使用 “<” 操作符来确定元素之间的优先级关系

6. 队列和优先级队列支持的操作

  • q.empty() : 如果队列为空,则返回 true,否则返回 false
  • q.size() : 返回队列中元素的个数
  • q.pop() : 删除队首元素,但不返回其值。
  • q.front() : 返回队首元素的值,但不删除该元素。 (该操作是适用于 queue 队列(deque、list))
  • q.back() : 返回队尾元素的值,但不删除该元素。 (该操作只适用于 queue 队列(deque、list))
  • q.top() : 返回具有最高优先级(优先级队列 priority_queue中队首元素优先级最高)的元素值,但不删除该元素。(该操作只适用于 priority_queue 优先级队列)
  • q.push(iem) :
    • 对于 queue ,在队尾压入一个元素,
    • 对于 priority_queue,在基于优先级的适当位置插入新元素。      
原创粉丝点击