#include <cstdio>
#include <map>
#include <string>
using namespace std;
map < string, int > m;
char line[32];
int main(void){
int n, t;
for(scanf("%d", &t); t--; ){
m.clear();
for(scanf("%d\n", &n); n--; ){
fgets(line, 32, stdin);
line[32] = 0;
++m[line];
}
map < string, int >::iterator it;
for(it = m.begin(); it != m.end(); it++)
printf("%s%d\n", it->first.c_str(), it->second);
if(t) puts("");
}
return 0;
}
这基本上接受了许多字符串,并按照它们的频率按排序顺序输出它们。我有个疑问。这里正在使用地图。因此,它接受字符数组中的字符串,然后直接在地图的特定位置递增。是不是要在地图的那个位置插入该字符串?像,
string s = line;
m.insert(pair<string,int>(s,1);
我们可以直接在该位置递增而不先插入吗?对不起,如果这是一个基本的疑问,但我不熟悉学习C ++。
答案 0 :(得分:2)
答案 1 :(得分:2)
operator[]
std::map
使用参数键搜索值,如果存在,则返回值,如果不存在,请使用默认构造值插入键,并返回新创建的值。
行:++m[line]
检查地图中是否存在带参数键的(键,值),如果退出则返回频率,如果没有插入值为{{ 1}}( int的默认值)。
其他建议,如果是用C ++编程,请在所有源代码中使用C ++。
0
和std::cin
std::cout
并使用std::getline
std::string
)是标准方法时,不必将void
作为参数。