2011-09-21 68 views
0

如果我想要無序地圖查找功能返回一個布爾值,我該怎麼做呢?使用無序地圖查找功能

這是我的代碼現在。

bool NS_SymbolTable::SymbolTable::Contains(std::string lexeme) 
    { 
     SymbolTable *tempSymbolTable = this; 
     std::unordered_map<std::string, Identifier*>::iterator it = tempSymbolTable->hashtable.find(lexeme); 

     return std::boolalpha; 
    } 

我還需要做什麼?是否有可能返回一個布爾?我已經找到了很少或沒有關於這方面的文檔。

這是我從http://msdn.microsoft.com/en-us/library/bb982431.aspx

+2

確切地說,你認爲'std :: boolalpha'是什麼意思?這不是一個布爾值... –

回答

1

有關文檔,請看std::unordered_map::find。它說:

返回值 迭代器到一個元素與鍵的關鍵。如果沒有找到這樣的元素,則返回past-the-end(參見end())迭代器。

要獲得布爾值指示的元素是否存在,使用

bool contained = it != tempSymbolTable->hashtable.end(); 
2

tempSymbolTable->hashtable.find(lexeme)一個例子將返回tempSymbolTable->hashtable.end()如果失敗了,所以你可以這樣的結果很簡單地轉換爲BOOL:也

return tempSymbolTable->hashtable.find(lexeme) != tempSymbolTable->hashtable.end(); 

,分配這一個臨時變量和通過這個工作是沒有必要的。你的函數可以簡化爲:

bool NS_SymbolTable::SymbolTable::Contains(std::string lexeme) 
{ 
    return hashtable.find(lexeme) != hashtable.end(); 
} 
1
bool NS_SymbolTable::SymbolTable::Contains(std::string lexeme) 
{ 
    SymbolTable *tempSymbolTable = this; 
    return tempSymbolTable->hashtable.end() != tempSymbolTable->hashtable.find(lexeme); 

} 
1

您需要測試發現的返回值對tempSymbolTable-> hastable.end(),如果它們相等,則沒有發現你的元素。找到這樣的作品的原因是因爲在目前的形式中,它比僅返回布爾值的東西更普遍。

0

std::unordered_map::find(),如標準集裝箱的其餘部分找到的功能,失敗則返回end()

試試這個:

bool NS_SymbolTable::SymbolTable::Contains(std::string lexeme) 
{ 
    SymbolTable *tempSymbolTable = this; 
    std::unordered_map<std::string, Identifier*>::iterator it = 
    tempSymbolTable->hashtable.find(lexeme); 

    return it != tempSymbolTable->hashtable.end(); 
} 

參考:

編輯:返回值的變化感。

+0

你的邏輯是相反的。如果地圖不包含字符串,這將返回true。 – Ferruccio

+0

你是不是指'it!= tempSymbolTable-> hashtable.end()'?該函數的名稱是'Contains()',返回'false'將違反直覺。 – Chad

+1

修好了,謝謝。他說他想讓它返回一個布爾,他沒有說它應該有什麼價值:) –