初始化我的std :: map

abh*_*aik 5 c++ stl initialization

我写了下面的代码,使用了一个Map.该程序查找string密钥出现的次数Map.如果只出现一次,则价值intstring重点应该是1,依此类推.这个程序运行并产生所需的输出 - 但我觉得这是纯粹的运气,因为我没有在任何地方初始化Map.我只是在做myMap[str]++- 这绝不保证最初的价值0.那么,如何初始化地图以便任何string键的值0在遇到之前我做了myMap[str]++

#include<cstdio>
#include<string>
#include<iostream>
#include<map>

int main()
{
    int t;
    long int n;
    std::string str;
    std::map< std::string, int > myMap;
    scanf("%d", &t);

    while(t--)
    {
        scanf("%ld", &n);
        std::cin.ignore();
        while(n--)
        {
            getline(std::cin, str);
            myMap[str]++;
        }

        for(std::map< std::string, int >::iterator it=myMap.begin(); it!=myMap.end(); it++)
            printf("%s %d\n", it->first.c_str(), it->second);
        printf("\n");

        myMap.erase(myMap.begin(), myMap.end());
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

样本输入:

2
6
03 10103538 2222 1233 6160 0142
03 10103538 2222 1233 6160 0141
30 10103538 2222 1233 6160 0141
30 10103538 2222 1233 6160 0142
30 10103538 2222 1233 6160 0141
30 10103538 2222 1233 6160 0142

5
30 10103538 2222 1233 6160 0144
30 10103538 2222 1233 6160 0142
30 10103538 2222 1233 6160 0145
30 10103538 2222 1233 6160 0146
30 10103538 2222 1233 6160 0143

样本输出:

03 10103538 2222 1233 6160 0141 1
03 10103538 2222 1233 6160 0142 1
30 10103538 2222 1233 6160 0141 2
30 10103538 2222 1233 6160 0142 2

30 10103538 2222 1233 6160 0142 1
30 10103538 2222 1233 6160 0143 1
30 10103538 2222 1233 6160 0144 1
30 10103538 2222 1233 6160 0145 1
30 10103538 2222 1233 6160 0146 1

详细的问题描述可以在这里找到.

谢谢!

R S*_*ahu 5

你说:

这绝不保证最初的值为0

这是不正确的.如果某个键对应的项目不在地图中,则在使用该operator[]功能时会初始化该值.

来自http://en.cppreference.com/w/cpp/container/map/operator_at:

如果执行插入,则映射值是值初始化的(默认为类类型构造,否则为零初始化),并返回对它的引用.

换一种说法,

        myMap[str]++;
Run Code Online (Sandbox Code Playgroud)

是有效和正确的代码.