预备知识
- map 容器
使用 map 容器存储的各个键值对,键的值既不能重复也不能被修改。换句话说,map 容器中存储的各个键值对不仅键的值独一无二,键的类型也会用 const 修饰,这意味着只要键值对被存储到 map 容器中,其键的值将不能再做任何修改。
本题中可能需要使用的 map 方法:
成员方法 |
功能 |
begin() |
返回指向容器中第一个(注意,是已排好序的第一个)键值对的双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
end() |
返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
find(key) |
在 map 容器中查找键为 key 的键值对,如果成功找到,则返回指向该键值对的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
insert() |
向 map 容器中插入键值对。 |
- 对组(pair)
对组的创建:
// 第一种方法 pair<string, int> pair1(string("name"), 20); cout << pair1.first << endl; //访问pair第一个值 cout << pair1.second << endl; //访问pair第二个值 // 第二种方法 pair<string, int> pair2 = make_pair("name", 30); cout << pair2.first << endl; cout << pair2.second << endl; // pair赋值 pair<string, int> pair3 = pair2; cout << pair3.first << endl; cout << pair3.second << endl;
- 字符函数库cctype
函数名称 |
说明 |
isalnum() |
判断是否是字母或者数字字符 |
isalpha() |
判断是否是字母字符 |
isdigit() |
判断是否是数字字符(0~9) |
ispunct() |
判断是否是标点符号字符 |
isspace() |
判断是否是标准空白(空格、制表符、换行等) |
islower |
判断是否是小写字母字符 |
isupper |
判断是否是大写字母字符 |
tolower |
转换成小写字母字符 |
toupper |
转换成大写字母字符 |
思路、步骤
- 键盘录入一个字符串
- 创建一个 map 容器对象 map<char, int> result,用于保存最终的字母字符和对应的个数的关系,键是 char 类型,值为 int 类型;
- 遍历字符串,获取每个字符,判断是否是字母字符(isalpha()),如果是字符则进行下一步处理;
- 通过 map 的 find(key) 函数查找当前遍历到的字符作为键在 map 中是否存在:如果不存在,通过 map 的 insert() 函数插入一个元素,值为 1,如果存在,则直接将值进行 + 1。
- 遍历输出结果。
代码实现
#include <iostream> #include <map> #include <cctype> #include <cstring> using namespace std; int main() { char str[100] = { 0 }; cin.getline(str, sizeof(str)); map<char, int> result; for (int i = 0; i < strlen(str); i++) { char ch = str[i]; if (isalpha(ch)) { map<char, int>::iterator it = result.find(ch); if (it != result.end()) { it->second += 1; } else { result.insert(make_pair(ch, 1)); } } } for (map<char, int>::iterator it = result.begin(); it != result.end(); it++) { cout << it->first << ":" << it->second << endl; } return 0; }