如何在c ++中设置大小并将地图初始化为零

时间:2011-06-04 05:18:01

标签: c++ maps

我宣布了map<string,int> registers等地图。如何将其设置为特定大小,如何将其所有值设置为零,以便稍后可以在映射值中插入值?

2 个答案:

答案 0 :(得分:8)

这个怎么样:

std::map<std::string, int>   registers; // done.
                                        // All keys will return a value of int() which is 0.


std::cout << registers["Plop"] << std::endl; // prints 0.

这很有效,因为即使registers为空。 operator []会将键插入到映射中,并将其值定义为类型的默认值(在本例中为整数为零)。

所以子表达式:

registers["Plop"];

相当于:

if (registers.find("Plop") == registers.end())
{
    registers.insert(make_pair("Plop", 0));
}
return registers.find("Plop").second;  // return the value to be used in the expression.

这也意味着以下工作正常(即使您之前没有定义过键)。

registers["AnotherKey"]++; // Increment the value for "AnotherKey"
                           // If this value was not previously inserted it will
                           // first be inserted with the value 0. Then it will  
                           // be incremented by the operator ++

std::cout << registers["AnotherKey"] << std::end; // prints 1

答案 1 :(得分:2)

  

如何将其设置为特定大小   以及如何将其所有值设置为   零

这可能是一个概念问题,而不是语法/“如何”问题。是的,只有通过给定键的初始访问,才会创建相应的值,默认情况下会设置为0,因为许多海报/评论者都说。但是你使用的一个重要的短语是:

  

所有值

它没有值开始,如果你在假设它编程的情况下进行编程,那么这就是导致概念错误的原因。

通常最好养成查找密钥是否在您的地图中的习惯,然后,如果没有,则做一些事情来初始化它。即使这看起来只是开销,但明确地做这样的事情可能会在将来防止出现概念错误,特别是当您尝试访问密钥的值而不知道它是否已经在地图中时。

一行摘要:您不想自己初始化值而不是让map为任何给定键的值分配其默认值吗?

因此,您可能想要使用的代码是:

    if(mymap.find(someKey) == mymap.end())
    {
        // initialize it explicitly
        mymap[someKey] = someInitialValue;
    }
    else
    {
        // it has a value, now you can use it, increment it, whatever
        mymap[someKey] += someIncrement;
    }