目录
第9周 STL-2
9-1 Set与Multiset
关联容器
set, multiset, map, multimap
内部元素有序排列,新元素插入的位置取决于它的值,查找速度快。
除了各容器都有的函数外,还支持以下成员函数:
find: 查找等于某个值 的元素(x小于y和y小于x同时不成立即为相等)
lower_bound : 查找某个下界
upper_bound : 查找某个上界
equal_range : 同时查找上界和下界
count :计算等于某个值的元素个数(x小于y和y小于x同时不成立即为相等)
insert: 用以插入一个元素或一个区间
multiset的成员函数
9-2 Map与Multimap
map的[ ]成员函数
若pairs为map模版类的对象,
pairs[key]
返回对关键字等于key的元素的值(second成员变量)的引用。若没有关键字为key的元素,则会往pairs里插入一个关键字为key的元素,其值用无参构造函数初始化,并返回其值的引用.如:
map<int,double> pairs;
则
pairs[50] = 5; 会修改pairs中关键字为50的元素,使其值变成5。若不存在关键字等于50的元素,则插入此元素,并使其值变为5。
9-3 容器适配器
容器适配器
可以用某种顺序容器来实现
(让已有的顺序容器以栈/队列的方式工作)
1) stack: 头文件 <stack>
• 栈 -- 后进先出
2) queue: 头文件 <queue>
• 队列 -- 先进先出
3) priority_queue: 头文件 <queue>
• 优先级队列 -- 最高优先级元素总是第一个出列
都有3个成员函数:
• push: 添加一个元素;
• top: 返回栈顶部或队头元素的引用
• pop: 删除一个元素
容器适配器上没有迭代器
STL中各种排序, 查找, 变序等算法都不适合容器适配器
stack
stack 是后进先出的数据结构
只能插入, 删除, 访问栈顶的元素
可用 vector, list, deque来实现
• 缺省情况下, 用deque实现
• 用 vector和deque实现, 比用list实现性能好
template<class T, class Cont = deque<T> >
class stack {
…
};
stack 中主要的三个成员函数:
• void push(const T & x);
将x压入栈顶
• void pop();
弹出(即删除)栈顶元素
• T & top();
返回栈顶元素的引用. 通过该函数, 可以读取栈顶
元素的值, 也可以修改栈顶元素
queue
和stack 基本类似, 可以用 list和deque实现
缺省情况下用deque实现
template<class T, class Cont = deque<T> >
class queue {
……
};
同样也有push, pop, top函数
• push发生在队尾
• pop, top发生在队头, 先进先出
priority_queue
和 queue类似, 可以用vector和deque实现
缺省情况下用vector实现
priority_queue 通常用堆排序技术实现, 保证最大的元素总是在最前面
• 执行pop操作时, 删除的是最大的元素
• 执行top操作时, 返回的是最大元素的引用
默认的元素比较器是 less<T>
#include <queue>
#include <iostream>
using namespace std;
int main() {
priority_queue<double> priorities;
priorities.push(3.2);
priorities.push(9.8);
priorities.push(5.4);
while( !priorities.empty() ) {
cout << priorities.top() << " ";
priorities.pop();
}
return 0;
} //输出结果: 9.8 5.4 3.2
9-4 算法
STL算法分类
STL中的算法大致可以分为以下七类:
• 不变序列算法
• 变值算法
• 删除算法
• 变序算法
• 排序算法
• 有序区间算法
• 数值算法
后续加