【问题标题】:How to set the size and initialize a map to zero in c++如何在 C++ 中设置大小并将地图初始化为零
【发布时间】:2011-09-08 06:12:32
【问题描述】:

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

【问题讨论】:

  • 您到底想将什么初始化为零?地图的默认构造函数创建空地图。您只能通过插入元素(如m["str1"]=0m.insert(std::map<std::string,int>::value_type("str2",0)))来增加地图的大小。
  • @Shadi:如果需要,您可以在for 循环中写入地图内容。 :) 你到底想做什么?
  • 还值得注意的是,如果“key”不在地图中,map["key"] 将返回 0(并将“key”插入地图)——因此,当您第一次访问它们
  • @Shadi - 从概念上讲,它们都为零。就像 Naveen 和 Cameron 所说,只要您使用 m[key] 访问元素,它就会为零。你不必做任何事情!
  • “将其设置为特定大小”是什么意思?映射的“大小”是它包含的键值对的数量。您可以在其中放置 30 个键来启动,但它们应该是哪些键,为什么?我认为你对这个东西的工作原理有一个根本的误解......

标签: c++ maps


【解决方案1】:

这个怎么样:

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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 2015-07-28
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多