[英]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++ 中,下標運算符的優先級高於前綴增量運算符。 但是
將不起作用,因為后綴增量比下標運算符具有更高的優先級。 有關 運算符優先級的更多信息,請參閱C++ 運算符優先級圖表。myMap["value"s]++
在這種情況下,這種排序是一件好事,因為它迫使您做出更好的編碼決策。 具體來說,在 C++ 中,出於優化原因,最佳實踐是使用前綴增量運算符而不是后綴增量運算符(盡管在大多數情況下,現代編譯器會為您清理這一點,最佳實踐仍然有效。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.