我正在使用地图来存储一堆键和值。我想使用find()来查找键并返回值。不幸的是,当我找不到密钥时,它会感到不安。如果没有找到密钥,如何让它返回0?
int bag::getItem( const string item)
{
return this->bagItems.find(item)->second;
return 0;
}
任何建议都将不胜感激。
答案 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;
}
}