预备知识
- 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;
}



京公网安备 11010502036488号