簡體   English   中英

如何從const引用中獲取鍵的值?

[英]How do I get the value for a key from a const ref?

為什么我在傳遞給函數的const ref unordered_map中無法獲取鍵的值,但是對於本地unordered_map卻可以呢?

GameObject(const std::unordered_map<int,std::unordered_map<int,int>>& objectParameters){
        if (objectParameters.find(CAPABILITY_TYPE_SPECIE)!=objectParameters.end()) {

 //Following line gives an error:
    auto map2 = objectParameters[CAPABILITY_TYPE_SPECIE];         

//Following line works just fine
            std::unordered_map<int,std::unordered_map<int,int>> objectParameters2;
            auto map = objectParameters2[CAPABILITY_TYPE_SPECIE];

        }

為什么無法從objectParameters獲取值? 編譯器抱怨的錯誤是:

類型'const std :: unordered_map>'沒有可行的重載運算符[]

編輯:從類型中刪除“常量”似乎會使錯誤消失。 這是為什么 ?

operator[]是一個非const成員函數,不能通過const引用在您擁有的對象上調用。 它不能是const成員,因為它被指定為如果鍵不在地圖中則插入一個項目 碰巧的是,您甚至不需要使用它。

您使用find()然后丟棄結果,為什么呢? 如果該項目存在,它將獲得該項目的迭代器。 所以不要丟棄它,使用它。

auto item = objectParameters.find(CAPABILITY_TYPE_SPECIE);
if (item != objectParameters.end()) {
     auto map2 = item->second;

盡管如果您希望map2map1已經存在的相同,則上述方法也不會這樣做。 由於auto map2item->second的副本。 要修改map1的項目,我們需要將map2用作參考:

auto item = objectParameters.find(CAPABILITY_TYPE_SPECIE);
if (item != objectParameters.end()) {
     auto& map2 = item->second;

關於您的編輯,刪除const以“修復”此類錯誤是錯誤的做法。 常量正確性很重要,當您執行這樣的“修復”操作時,它可能會在代碼中引入一些細微的錯誤。 因為現在不該更改的內容可能開始發生意外更改。

為什么無法從objectParameters獲取值?

因為當使用運算符[]和鍵訪問地圖元素時,該元素將被創建。 顯然,如果map為const編譯器將無法執行此操作。

您可以嘗試使用.at()因為它具有const重載http://en.cppreference.com/w/cpp/container/map/at

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM