簡體   English   中英

在字符串的 std::map 中查找時出現編譯錯誤,長

[英]Compilation error in find in a std::map of string, long

我正在使用 VC++ 開發 Visual Studio 2013。 我有一個 std::map 如下,

std::map<std::string, unsigned int> myMap;

作為類的靜態成員。

我通過這樣做將值填充到其中,

string key = "value";
std::map<std::string, unsigned int>::iterator it = myMap.find(key);

if(it == myMap.end())
    myMap.insert(std::pair<std::string, unsigned int> (key, 1));
else
{
    int prev_value = it->second;
    prev_value++;
    myMap.insert(std::pair<std::string, unsigned int> (key, prev_value));
}

這不會編譯,我收到此編譯錯誤,

1   IntelliSense: no suitable user-defined conversion from "std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string, long>>>>" to "std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string, unsigned int>>>>" exists  c:\filename.cpp 15

15是這條線,

std::map<std::string, unsigned int>::iterator it = myMap.find(key);

而這個錯誤,

2   IntelliSense: no operator "==" matches these operands
        operand types are: std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string, unsigned int>>>> == std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string, long>>>> c:\filename.cpp  17

第 17 行是這個,

if(it == myMap.end())

有人可以幫我解決這個問題嗎?

謝謝

不會得到這個錯誤,如果你的聲明實際上是:

std::map<std::string, unsigned int> myMap

但是,如果您的定義是偶然的,您會得到這個確切的錯誤

std::map<std::string, long> myMap

Herb Sutter 在他著名的“ Almost Always Auto”中提出了以下准則:

請記住,首選auto變量的主要動機是正確性、性能、可維護性和健壯性——最后是打字方便。

正如 Herb Sutter 所建議的, auto (和make_pair )不僅可以使您的代碼正確,而且可以使其更加健壯,也就是說,它將支持myMap獨立於您使用的上述哪個聲明的聲明:

const string key = "value"s;
const auto it = arg.find(key);

if(it == arg.end()) {
    arg.insert(make_pair(key, 1));
} else {
    int prev_value = it->second;
    prev_value++;
    arg.insert(make_pair(key, prev_value));
}

現場示例

編輯:

Igor Tandetinik 提醒我map::insert

如果容器尚未包含具有等效鍵的元素,則將元素插入到容器中

這意味着你的整個else -block 不做任何事情,導致它只在map已經包含具有等效鍵的元素時觸發。 大概你打算使用map::insert_or_assign或類似的,在這種情況下,你的整個代碼應該簡單地替換為:

++myMap["value"s]

編輯2:

請注意,上述方法有效,因為在 C++ 中,下標運算符的優先級高於前綴增量運算符。 但是 myMap["value"s]++ 將不起作用,因為后綴增量比下標運算符具有更高的優先級。 有關 運算符優先級的更多信息,請參閱C++ 運算符優先級圖表

在這種情況下,這種排序是一件好事,因為它迫使您做出更好的編碼決策。 具體來說,在 C++ 中,出於優化原因,最佳實踐是使用前綴增量運算符而不是后綴增量運算符(盡管在大多數情況下,現代編譯器會為您清理這一點,最佳實踐仍然有效。)

暫無
暫無

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

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