[英]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.