静态std::unordereded_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
异常。您可能会觉得有必要捕捉这个异常来检查元素是否存在。不要这样做。对控制流使用异常是非常糟糕的做法。除此之外,在抛出异常时速度非常慢。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 具有默认值的引用获取函数
- 当给定默认值时,为什么此模板参数推导失败
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 格式化浮点值:返回默认值
- 如何将数组部分初始化为某个默认值?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 创建一个包含 c++ 默认值的环境文件
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- Switch 语句(字符串)一直选择默认值,除非其为零
- 如何使用默认值将枚举声明为 extern
- 如何在提升程序选项中设置矢量<矢量>的默认值<string>
- 如何使用默认值为构造函数中的枚举赋值?
- 变量始终在函数中重置为默认值
- 如何在 c++ 中使用默认值将 std::set 转换为 std::map
- 新的STD :: MAP条目中指针的默认值
- C ++多个CIN默认值(如果未输入),则添加到map<string,vector<double>>
- map检查map是否被分配了非默认值
- 为什么不能为类型的函数参数设置默认值<map>?