这个地图如何在C ++中运行?

时间:2014-09-26 16:02:31

标签: c++

#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 ++。

2 个答案:

答案 0 :(得分:2)

您正在使用map

中的索引访问权限
++m[line];

如果密钥尚未存在,则使用索引访问始终会插入新的默认值。

阅读文档:link

答案 1 :(得分:2)

operator[] std::map使用参数搜索,如果存在,则返回,如果不存在,请使用默认构造值插入,并返回新创建的值。

行:++m[line]检查地图中是否存在带参数键的(键,值),如果退出则返回频率,如果没有插入值为{{ 1}}( int的默认值)。

其他建议,如果是用C ++编程,请在所有源代码中使用C ++。

  • 使用0std::cin
  • 进/出
  • 使用std::cout并使用std::getline
  • 读取行
  • 在C ++ main中,当不使用参数(std::string)是标准方法时,不必将void作为参数。
相关问题