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