#include <bits/stdc++.h>
using namespace std;
int main()
{
map<char,int> m; // 修改为使用字符作为键
string s;
getline(cin, s); // 使用getline来获取包含空格的输入字符串
for(int i=0;i<s.length();i++){
if(isalpha(s[i])){ // 如果是字母,别忘了
char ch = tolower(s[i]); // 转换为小写字母
if(m[ch] == 0){
m[ch] = 1;
} else {
m[ch]++;
}
}
}
char maxChar = '\0';
int maxFreq = 0;
for(auto& entry : m) { //注意这一块代码的写法
if(entry.second > maxFreq) {
maxFreq = entry.second;
maxChar = entry.first;
}
}
cout << maxChar << " " << maxFreq << endl;
return 0;
}
这句代码使用了 C++11 中的范围基于循环(Range-based for loop)。这种循环语法可以更方便地遍历容器(比如数组、向量、map等)中的元素。
语法结构如下:
for (declaration : expression) {
// statements
}
在这里,declaration
是一个用来声明并初始化一个变量的语句,这个变量会依次取得 expression
(通常是一个容器)中的每个元素的值。expression
是一个表示容器的表达式。在每次迭代中,declaration
的变量被自动赋值为 expression
中的下一个元素,然后循环体内的语句会被执行。
在本例中,for(auto& entry : m)
意味着我们遍历了m
这个map中的每一个键值对(key-value pair),其中 entry
是一个变量,表示当前迭代的键值对。在循环内部,我们通过 entry.first
获取键,通过 entry.second
获取值。
这种范围基于循环的语法简洁直观,常常用于遍历容器,是 C++11 提供的一种方便的循环语法。
常见疑惑:1auto是什么意思 2为什么要用一个& 3为什么:后面加容器
-
auto
是 C++11 引入的关键字,用于自动地让编译器推断变量的类型。使用auto
关键字声明变量时,编译器会根据等号右边的表达式推断出变量的类型。例如,auto x = 5;
中的x
的类型会被推断为整数型。在范围基于循环中的使用,auto
的作用是让编译器推断迭代变量的类型,使代码更加简洁和易读。比如,for (auto& entry : m)
中的entry
类型会被推断为m
map 中的元素类型。 -
在
for(auto& entry : m)
中,&
表示迭代变量entry
是一个引用,这样做的目的是为了避免对容器中的元素进行复制,从而提高程序的效率。使用引用可以直接访问容器中的元素,而不是通过复制一个新的对象。 -
在范围基于循环中,
:
后面加上一个容器(比如数组、向量、map、列表等)表示要遍历这个容器中的所有元素。这种语法结构使得代码编写更加简洁清晰,同时也能避免手动管理循环变量和迭代器。