如何在C++中设置大小并将映射初始化为零
问题描述:
我声明了一个映射,如map<string,int> registers
。如何将其设置为特定的大小,以及如何将其所有值设置为零,以便稍后可以在映射的值中插入值?如何在C++中设置大小并将映射初始化为零
答
如何:
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;
}
你为什么要这么做?为什么不简单地使用'm [“abc”] = 1;'? – Naveen 2011-06-04 05:20:43
所以我不能使用循环或东西,而不是写地图的所有内容 – Shadi 2011-06-04 05:22:09
什么你想要初始化为零?地图的默认构造函数创建空地图。你可以通过插入元素(比如'm [“str1”] = 0'或m.insert(std :: map :: value_type(“str2”,0))来增加地图的大小。 ')。 –
2011-06-04 05:27:56