c ++ map find не может найти конкретный ключ - PullRequest
0 голосов
/ 03 декабря 2011

Я использую карту для хранения набора ключей и значений.Я хочу использовать find (), чтобы найти ключ и вернуть значение.К сожалению, когда я не могу найти ключ, он расстраивается.Как я могу вернуть 0, если ключ не найден?

 int bag::getItem( const string item)
 {
    return this->bagItems.find(item)->second;
    return 0;
 }

Буду признателен за любые предложения.

Ответы [ 5 ]

4 голосов
/ 03 декабря 2011

map::find возвращает значение map::end(), если значение не найдено. Это значение итератора, которое вы не можете разыменовать, поэтому слепо делать bagItems.find(item)->second - это нет-нет.

Вместо этого проверьте возвращаемое значение и действуйте соответственно:

int bag::getItem( const string item) 
{ 
    // We don't know what CONST_ITERATOR_TYPE is, but you do
    CONST_ITERATOR_TYPE i = this->bagItems.find(item);
    return i == this->bagItems.end() ? 0 : i->second;
} 

Для этого вам понадобится локальная переменная типа const_iterator; однако этот тип зависит от аргументов шаблона вашей карты (чего мы не знаем). Так что вам придется заполнить пробел в себе.

Если вам удобно использовать компилятор C ++ 11, удобный

auto i = this->bagItems.find(item);

будет работать.

1 голос
/ 03 декабря 2011

вы должны проверить возвращаемое значение (это итератор), если оно что-то нашло:

int bag::getItem(const string & item) const
{
    map<string, int>::const_iterator iter = this->bagItems.find(item);
    return iter != this->bagItems.end() ? iter->second: 0;
}
0 голосов
/ 03 декабря 2011

Вы должны проверить, находится ли итератор в конце контейнера

int bag::getItem( const string item)
 {
  {the type of bagItems}::const_iterator it ;
  it = bagItems.find(item) ;
  if ( it == bagItems.end()) {
    return 0;
  } else  {
      return bagItems.find(item)->second;
  }

 }
0 голосов
/ 03 декабря 2011
int bag::getItem( const string item)
{

map::const_iterator iter =  this->bagItems.find(item); //correct type here ;]
if(iter != this.bagItems.end())
    return iter->second;

return 0;

}
0 голосов
/ 03 декабря 2011

Вы должны добавить метод проверки в getItem(), чтобы увидеть, возвратил ли вызов find() bagItems.end (). Если это так, то вы знаете, что предмет не был найден.

...