我使用映射来存储一堆键和值。我想使用find()来查找键并返回值。不幸的是,当我找不到钥匙时,它就会心烦意乱。如果没有找到键,我如何使它返回0 ?
int bag::getItem( const string item)
{
return this->bagItems.find(item)->second;
return 0;
}
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);
。
你必须检查返回值(它是一个迭代器),如果它发现了什么:
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;
}
您应该在getItem()
方法中添加检查,以查看对find()
的调用是否返回bagItems.end()。
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;
}
必须检查迭代器是否位于容器的末尾
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;
}
}