c ++ map find找不到具体的Key

时间:2011-12-03 16:09:31

标签: c++ map find

我正在使用地图来存储一堆键和值。我想使用find()来查找键并返回值。不幸的是,当我找不到密钥时,它会感到不安。如果没有找到密钥,如何让它返回0?

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

任何建议都将不胜感激。

5 个答案:

答案 0 :(得分:4)

如果找不到值,则

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 :(得分:1)

如果找到了某些东西,你必须检查返回值(它是一个迭代器):

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

答案 2 :(得分:0)

您应该在getItem()方法中添加一个检查,以查看对{​​{1}}的调用是否返回了bagItems.end()。如果确实如此,则表示未找到该项目。

答案 3 :(得分:0)

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;

}

答案 4 :(得分:0)

您必须检查迭代器是否不在容器的末尾

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

 }