2011-06-04 241 views
2

我声明了一个映射,如map<string,int> registers。如何将其设置为特定的大小,以及如何将其所有值设置为零,以便稍后可以在映射的值中插入值?如何在C++中设置大小并将映射初始化为零

+0

你为什么要这么做?为什么不简单地使用'm [“abc”] = 1;'? – Naveen 2011-06-04 05:20:43

+0

所以我不能使用循环或东西,而不是写地图的所有内容 – Shadi 2011-06-04 05:22:09

+2

什么你想要初始化为零?地图的默认构造函数创建空地图。你可以通过插入元素(比如'm [“str1”] = 0'或m.insert(std :: map :: value_type(“str2”,0))来增加地图的大小。 ')。 – 2011-06-04 05:27:56

回答

5

如何:

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 
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; 
    } 
相关问题