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