簡體   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