繁体   English   中英

静态std :: unordered_map的默认值

[英]Default value of static std::unordered_map

我想知道在静态static std::unordered_map<std::string, struct>的结构中变量的默认值。

这是我的示例代码:

#include <iostream>
#include <string>
#include <unordered_map>

int main()
{
    enum MyStateType
    {
        MY_STATE_NEW,
        MY_STATE_RUN,
        MY_STATE_FREE
    };
    struct Foo
    {
        int num;
        MyStateType state;
    };
    static std::unordered_map<std::string, Foo> map;

    std::cout << map["Apple"].num << '\n';
    std::cout << map["Apple"].state << '\n';
}

输出结果:

0
0
Program ended with exit code: 0

是否可以安全地认为Foo内部的变量始终在开始时初始化为0

是的,实际上可以安全地假设,由于operator[]的行为, Foo中的值总是被初始化为零。

使用默认分配器时,这将导致从键复制/移动键,并且对映射的值进行值初始化。

您没有提供构造函数,这意味着Foo中的每个字段都将分别进行值初始化,对于原始类型而言,这意味着零初始化。

您实际上在这里面临的问题是地图中不存在名为"Apple"的字段。 不幸的是, operator[]的语义是这样的:如果值不存在,则将在运行中创建它。 您甚至可能不想访问地图中不存在的字段,并且正在询问是否始终将其初始化为零,以便可以使用此事实检查元素是否存在。 但是,为此目的,您应该使用find()at()成员函数。

  • 如果元素不存在,则find()将返回指向地图末尾的迭代器。 这意味着您可以使用以下方法保护元素访问

     if (auto apple = map.find("Apple"); apple != map.end()) { std::cout << apple->second.num << '\\n'; std::cout << apple->second.state << '\\n'; } 

    (使用C ++ 17 if语句初始化程序)

  • 如果找不到元素,则at()将引发异常。

     std::cout << map.at("Apple").num << '\\n'; std::cout << map.at("Apple").state << '\\n'; 

    这将使您的程序崩溃,并带有std::out_of_range异常。 您可能会想捕获此异常以检查元素是否存在。 不要这样 将异常用于控制流是非常不好的做法。 最重要的是,在抛出异常时,它们的速度非常慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM