2011-09-21 58 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

修好了,谢谢。他说他想让它返回一个布尔,他没有说它应该有什么价值:) –