映射(map)
- 映射与集合同属于单重关联容器,它们的主要区别在于,集合的元素类型是键本身,而映射的元素类型是由键和附加数据所构成的二元组。
- 在集合中按照键查找一个元素时,一般只是用来确定这个元素是否存在,而在映射中按照键查找一个元素时,除了能确定它的存在性外,还可以得到相应的附加数据。
例
有五门课程,每门都有相应学分,从中选择三门,输出学分总和
//map1.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
例
统计一句话中每个字母出现的次数
// map2.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;
}