C++ 学习笔记 2.1 : 容器和算法(顺序容器、关联容器、泛型算法)
来源:互联网 发布:触摸屏如何编程 编辑:程序博客网 时间:2024/05/07 05:12
1. 容器适配器
- 三种顺序容器适配器:queue 、 priority_queue 和 stack 。
- 容器适配器:让一种已存在的容器类型采用另一种不同的抽象类型(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 容器上实现。
- 默认的 stak 和 queue 都是基于 deque 容器实现。
- 适配器约束条件:
- stack 适配器所关联的基础容器可以是任意一种顺序容器类型:
- stack栈 (默认 deque 实现),可以建立在 vector、list 和 deque 容器之上
- queue适配器(默认 deque 实现),要求必须提供 push_front 运算,只能建立在 list 和 deque 容器上。不能建立在 vector 上。
- priority_queue 适配器(默认 vector 实现),要求必须提供快速随机访问,因此可建立在 vector 或 deque 容器上,不能建立在 list 容器上。
- stack 适配器所关联的基础容器可以是任意一种顺序容器类型:
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 操作。
- 不能在 stack 栈上调用 deque 的相关函数:
- 尽管 stack 栈是以 deque 容器为基础实现的,并且栈是操作也是以 deque 的操作实现,但是程序员不能直接访问 deque 所提供的操作
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,在基于优先级的适当位置插入新元素。
- C++ 学习笔记 2.1 : 容器和算法(顺序容器、关联容器、泛型算法)
- C++学习笔记2.2 : 容器和算法之关联容器
- 【C++ Primer 学习笔记】: 容器和算法之【关联容器】
- 【C++ Primer 学习笔记】: 容器和算法之【顺序容器】
- c++primer学习笔记 - 容器和算法
- 第一部分(3/9/10/11章):顺序容器 泛型算法 关联容器
- 顺序容器和关联容器
- 关联容器和顺序容器
- 第二部分<容器和算法>--顺序容器
- [C++]容器和算法
- C++容器(顺序容器、关联容器)
- (第二部分)容器和算法——顺序容器
- 顺序容器和简单算法
- C++学习笔记---容器和算法
- 关联容器和顺序容器的差别
- 顺序容器和关联容器的比较
- Cpp Primer<<学习容器与算法--顺序容器_8
- 容器 泛型算法
- C++ 学习笔记 1.0 : 基本语言(变量和基本类型,标准库类型,表达式,语句,函数,标准IO库)
- 求1-N中十进制正整数1的个数
- 新的开始
- 闲聊ClassLoader的父加载器
- 130712解题报告续
- C++ 学习笔记 2.1 : 容器和算法(顺序容器、关联容器、泛型算法)
- ios中NSUserDefault的使用
- 从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr<class>、实现Ptr_vector
- 《EJB3.0入门经典》笔记
- coidlity上的问题 之一 EQUI
- 算法分析---外星人计算PI的程序
- Mysql sql语句大全
- 遍历Map的几种方法《转载》
- 2013年7月12日“修复 Migration 测试发现的 Bug”