问题描述
||
我声明的是地图,例如
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;
}