используя функцию поиска неупорядоченной карты - PullRequest
0 голосов
/ 21 сентября 2011

Если я хочу, чтобы функция поиска неупорядоченной карты возвращала значение bool, как бы я это сделал?

Вот мой код прямо сейчас.

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

Ответы [ 5 ]

2 голосов
/ 22 сентября 2011

tempSymbolTable->hashtable.find(lexeme) вернет tempSymbolTable->hashtable.end() в случае неудачи, поэтому вы можете преобразовать этот результат в логическое значение очень просто:

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

Кроме того, присваивать это временной переменной и работать с ней не нужно. Ваша функция может быть уменьшена до:

bool NS_SymbolTable::SymbolTable::Contains(std::string lexeme)
{
    return hashtable.find(lexeme) != hashtable.end();
}
1 голос
/ 22 сентября 2011

Для документации смотрите std :: unordered_map :: find .Там написано:

Возвращаем значение итератора для элементов с ключом key.Если такой элемент не найден, возвращается итератор конца-конца (см. End ()).

Чтобы получить логическое значение, указывающее, присутствует ли элемент, используйте

bool contained = it != tempSymbolTable->hashtable.end();
1 голос
/ 22 сентября 2011

Вам нужно проверить возвращаемое значение find с помощью tempSymbolTable-> hastable.end (), если они равны, значит, он не нашел ваш элемент.Причина, по которой поиск работает так, заключается в том, что в его текущей форме он является более общим, чем то, что возвращает только логическое значение.

1 голос
/ 22 сентября 2011
bool NS_SymbolTable::SymbolTable::Contains(std::string lexeme)
{
    SymbolTable *tempSymbolTable = this;
    return tempSymbolTable->hashtable.end() != tempSymbolTable->hashtable.find(lexeme);

}
0 голосов
/ 22 сентября 2011

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();
}

Ссылка:

EDIT : изменить смысл возвращаемого значения.

...