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

问题描述

|| 我声明的是地图,例如
map<string,int> registers
。如何将其设置为特定大小,如何将其所有值设置为零,以便以后可以在映射值中插入值?     

解决方法

        这个怎么样:
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
为空。运算符[]将把键插入到映射中,并将其值定义为该类型的默认值(在这种情况下,整数为零)。 所以子表达式:
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
    ,           我如何将其设置为特定大小   以及如何将其所有值设置为   零 这可能是概念上的问题,而不是语法/“如何”问题。是的,的确如此,就像许多发布者/评论者所说的那样,仅通过使用给定键的初始访问,该对应的值将被创建并默认设置为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;
    }