当前课程知识点:C++语言程序设计进阶 > 第十章 泛型程序设计与C++标准模板库 > 关联容器 > 映射
映射与集合同属于单重关联容器,它们的主要区别在于,集合的元素类型是键本身,而映射的元素类型是由键和附加数据所构成的二元组。
在集合中按照键查找一个元素时,一般只是用来确定这个元素是否存在,而在映射中按照键查找一个元素时,除了能确定它的存在性外,还可以得到相应的附加数据。
有五门课程,每门都有相应学分,从中选择三门,输出学分总和
//10_10.cpp #include <iostream> #include <map> #include <string> #include <utility> using namespace std; int main() { map<string, int> courses; //将课程信息插入courses映射中 courses.insert(make_pair("CSAPP", 3)); courses.insert(make_pair("C++", 2)); courses.insert(make_pair("CSARCH", 4)); courses.insert(make_pair("COMPILER", 4)); courses.insert(make_pair("OS", 5)); int n = 3; //剩下的可选次数 int sum = 0; //学分总和 while (n > 0) { string name; cin >> name; //输入课程名称 map<string, int>::iterator iter = courses.find(name);//查找课程 if (iter == courses.end()) { //判断是否找到 cout << name << " is not available" << endl; } else { sum += iter->second; //累加学分 courses.erase(iter); //将刚选过的课程从映射中删除 n--; } } cout << "Total credit: " << sum << endl; //输出总学分 return 0; } 运行结果如下: C++ COMPILER C++ C++ is not available CSAPP Total credit: 9
统计一句话中每个字母出现的次数
// 10_11.cpp #include <iostream> #include <map> #include <cctype> using namespace std; int main() { map<char, int> s; //用来存储字母出现次数的映射 char c; //存储输入字符 do { cin >> c; //输入下一个字符 if (isalpha(c)){ //判断是否是字母 c = tolower(c); //将字母转换为小写 s[c]++; //将该字母的出现频率加1 } } while (c != '.'); //碰到“.”则结束输入 //输出每个字母出现次数 for (map<char, int>::iterator iter = s.begin(); iter != s.end(); ++iter) cout << iter->first << " " << iter->second << " "; cout << endl; return 0; }
大家好
欢迎回来
继续学习C++语言程序设计
这一节我们来学习映射
映射与集合
同属于单重关联容器
它们的主要区别就在于
集合的元素类型是键本身
而映射的元素类型
是由键和附加数据
所构成的二元组
在集合中
按照键查找一个元素的时候
一般只是用来确定
这个元素是否存在
而在映射中呢
要查找一个元素的时候
是按照键
首先找它是否存在
此外呢
还可以得到它相应的附加数据
下面我们就来看一个
使用映射的例子
在五门课里面选择三门课
然后得到它的学分总和
这里我们将课程名
和这个课的学分
作为一个键值对放在这个映射中
我们来看
这个
我们连续将五门课程的课程名
和学分
作为五个键值对插入到课程
course这个映射中
然后呢
我们将可以选课的次数
设为3
学分总和呢初始化为0
接下来呢
如果三次选课还没有选完
也就是n大于0
这个while循环就继续
这个时候呢
首先输入课程名称
然后我们来映射中
去查找有没有这个课程名
如果找不到
那就说没有这门课
这样的话这个循环又开始
继续请输入课程名
再查找
如果找到了
那么就把这个课的学分拿出来
找到了
那就是用这个iter迭代器
指向的对象找到它的学分
把学分累加上去
然后从这个course这个映射中
删除这个iter这个迭代器
指向的这个对象
就把刚选过的课删除了
那么选课机会 选课次数-1
如此循环
把三门课都选好了
这个循环就结束了
最后输出总学分数
这个是某一次运行的时候的情况
接下来的这个例子呢
也用到了映射
统计一句话中
出现的各个字母的次数
首先构造一个映射对象s
用来存储字母出现的次数的映射
然后在这个do while循环中呢
又依次输入字符
直到输入的是点为止
也就是这一句话
都输入完了为止
每次读入一个字符
先判断是否字母
如果是字母的话
不区分大小写
所以就将字母转换为小写
大写 小写的出现次数
都统计到一起
然后接下来怎么样去统计呢
大家看
这里用了下标运算
好象是以c为下标
那这个运算的含义就是
如果在这个映射中
没有出现过c
那么就将c插入到映射中去
如果这个映射中出现了c
就把那一项的引用返回
然后将它的
所以我们这得到的呢
就是c这个字母对应的
它那个项的引用
我们将它的出现次数+1
如此循环往复
直到遇到一个点就结束
这样的话呢
我们就在这个映射中
统计了每个字母的出现次数
最后用一个for循环
从这个映射中
依次输出每个字母
以及它的出现次数
这个循环中是用
迭代器遍历整个映射的
-导学
--导学
-继承的基本概念和语法
-第七章 继承与派生--继承的基本概念和语法习题
-继承方式
-第七章 继承与派生--继承方式
-基类与派生类类型转换
-第七章 继承与派生--基类与派生类类型转换
-派生类的构造和析构
--派生类的构造函数
--派生类的析构函数
--第七章 继承与派生--派生类的构造和析构
-派生类成员的标识与访问
--虚基类
-第七章 继承与派生--派生类成员的标识与访问
-小结
--小结
-综合实例
--第七章综合实例
-实验七
--实验七
-导学
--导学
-第八章 多态性--导学
-运算符重载
--运算符重载的规则
-第八章 多态性--运算符重载
-虚函数
--虚函数
--虚析构函数
--虚表与动态绑定
-第八章 多态性--虚函数
-抽象类
--抽象类
--第八章 多态性--抽象类
-override与final
-第八章 多态性--override与final
-小结
--第八章小结
-综合实例
--第八章综合实例
-实验八
--实验八
- 第八章讲义
-导学
--导学
-模板
--函数模板
--类模板
-第九章 模板与群体数据--模板
-线性群体
--线性群体的概念
-第九章 模板与群体数据--线性群体
-数组
--数组类模板
-链表
--链表类模板
-第九章 模板与群体数据--链表
-栈
--栈类模板
--栈类模板课后习题
--例9-9 栈的应用课后习题
-队列
--队列类模板
-第九章 模板与群体数据--队列
-排序
--排序概述
--插入排序
--选择排序
--交换排序
-第九章 模板与群体数据--排序
-查找
--查找
--查找课后习题
-小结
--小结
-综合实例
--综合实例
-实验九
--实验九
- 第九章讲义
-导学
--导学
-泛型程序设计及STL的结构
--STL简介
-第十章 泛型程序设计与C++标准模板库--泛型程序设计及STL的结构
-迭代器
--迭代器
-第十章 泛型程序设计与C++标准模板库--迭代器
-容器的基本功能与分类
-第十章 泛型程序设计与C++标准模板库--容器的基本功能与分类
-顺序容器
--顺序容器的特征
--第十章 泛型程序设计与C++标准模板库--顺序容器
-关联容器
--集合
--映射
-第十章 泛型程序设计与C++标准模板库--关联容器
-函数对象
--函数对象
--函数适配器
-算法
--算法
-小结
--第十章小结
-综合实例
--综合实例
-实验十
--实验十
- 第十章讲义
-导学
--导学
-I/O流的概念及流类库结构
-第十一章 流类库与输入/输出--I/O流的概念及流类库结构
-输出流
--输出流概述
--向文本文件输出
--向二进制文件输出
--向字符串输出
-第十一章 流类库与输入/输出--输出流
-输入流
--输入流概述
--输入流应用举例
--从字符串输入
-第十一章 流类库与输入/输出--输入流
-输入/输出流
--输入/输出流
-第十一章 流类库与输入/输出--输入/输出流
-小结
--小结
-综合实例
--综合实例
-实验十一
--实验十一
- 第十一章讲义
-导学
--第12章导学
-异常处理的思想与程序实现
-第十二章 异常处理--异常处理的思想与程序实现
-异常处理中的构造与析构
-第十二章 异常处理--异常处理中的构造与析构
-标准程序库异常处理
-第十二章 异常处理--标准程序库异常处理
-小结
--第12章小结
-综合实例
--综合实例
-实验十二
--实验十二
- 第十二章讲义