2013-03-16 69 views
0

我使用map.find(鍵)和map.end()函數中的if語句:map.find()和map.end()迭代器據說不兼容?

if(p_Repos->returnTypeMap().find(tc[0]) != p_Repos->returnTypeMap().end()) 

但它不工作,我也得到一個Microsoft Visual C++運行時庫錯誤,告訴我「表達式:列表迭代器不兼容」。 tc [0]只是一個字符串,我的地圖中的關鍵位置是一個字符串。

但是,他們應該是兼容的,對吧?

任何幫助,非常感謝。

感謝, 湯姆

編輯:基於在這裏找到了答案:Finding value in unordered_map,我帶領相信這應該高清工作。

第二個編輯:
這裏是returnTypeMap()函數:

std::unordered_map <std::string, std::pair<std::string, std::string>> returnTypeMap() 
{ 
     return typeTable; 
} 

這裏是我的地圖的定義:

std::unordered_map <std::string, std::pair<std::string, std::string>> typeTable; 
+1

是否'returnTypeMap( )'按價值回報?如果是這樣,每個迭代器都指向一個完全不同的'map'。 – Mankarse 2013-03-16 03:19:31

+0

Mankarse,我不確定你的意思。我應該設置一個本地地圖=存儲在我的p_Repos對象中的地圖嗎? – traggatmot 2013-03-16 03:26:17

+0

也許你應該使用if(p_Repos-> returnTypeMap()。count(tc [0])> 0)'。 – leewz 2013-12-26 07:45:44

回答

5

您返回map的價值,所以每次調用評估爲完全不同的map。迭代器到不同的容器是不兼容的,試圖比較它們有未定義的行爲。

試着改變你的代碼通過const參考返回:

std::unordered_map<std::string, std::pair<std::string, std::string>> const& 
returnTypeMap() const 
{ 
    return typeTable; 
} 

或使地圖的本地副本,並在單一的本地副本叫findend

auto typeTable{p_Repos->returnTypeMap()}; 
if (typeTable.find(tc[0]) != typeTable.end()) { 
    //... 
} 
+0

謝謝 - 我會做一個本地副本,因爲我不擅長使用const限定符。如果您不介意更具體地說明我將如何使用const限定符,那麼我可能會嘗試實現它。 – traggatmot 2013-03-16 03:27:42

+0

@traggatmot:重要的部分不是'const'限定符,而是您將通過引用返回的事實(因此在返回時不會複製'typeTable')。 – Mankarse 2013-03-16 03:37:31