预备知识

  • map 容器
map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型。在使用 map 容器存储多个键值对时,该容器会自动根据各键值对的键的大小,按照既定的规则进行排序。默认情况下,map 容器选用 std::less<T> 排序规则(其中 T 表示键的数据类型),其会根据键的大小对所有键值对做升序排序。
使用 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)将一对值组合成一个值,这一对值可以具有不同的数据类型,两个值可以分别用 pair 的两个公有属性 first 和 second 访问。
对组的创建:
// 第一种方法
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

转换成大写字母字符

思路、步骤

  1. 键盘录入一个字符串
  2. 创建一个 map 容器对象 map<char, int> result,用于保存最终的字母字符和对应的个数的关系,键是 char 类型,值为 int 类型;
  3. 遍历字符串,获取每个字符,判断是否是字母字符(isalpha()),如果是字符则进行下一步处理;
  4. 通过 map 的 find(key) 函数查找当前遍历到的字符作为键在 map 中是否存在:如果不存在,通过 map 的 insert() 函数插入一个元素,值为 1,如果存在,则直接将值进行 + 1。
  5. 遍历输出结果。 

代码实现

#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;
}