我正在尝试执行将返回在向量中找到事件的位置的函数。但我的返回值始终为0,我确信有匹配。
以下是代码:
int findInItemvector(vector<Item> vec, string name)
{
for(vector<Item>::iterator it = vec.begin(); it < vec.end(); it++)
{
if(it->getName() == name)
{
return it - vec.begin();
break;
}
else
{
return 0;
}
}
}
答案 0 :(得分:6)
当你的第一个元素不匹配时,else分支执行return
,这将使函数和循环的其余部分不被执行。你想要这样的东西:
int findInItemvector(vector<Item> vec, string name)
{
for(vector<Item>::iterator it = vec.begin(); it < vec.end(); it++)
{
if(it->getName() == name)
{
return it - vec.begin();
}
}
return 0;
}
但是,由于第一项也可以匹配(在这种情况下it - vec.begin() == 0
),我建议你使用其他保护值,例如-1(永远不能是有效的矢量索引)。
答案 1 :(得分:5)
你的'else'子句就是问题所在:如果第一个项不匹配,'else'就会启动,你的'return 0'语句会让你脱离'for'循环而不尝试任何一个向量中的其他元素。
尝试摆脱'else',并在'for'循环结束后将'return 0'移动到。
答案 2 :(得分:1)
由于当前编写的方式,您的函数将始终返回0。如果在向量的第一项中找到匹配,则减法的结果当然为零。如果它不匹配,则else部分执行并返回0,并且函数退出。
该功能应该看起来像这样
int findInItemvector(const vector<Item>& vec, string name)
{
for(vector<Item>::const_iterator it = vec.begin(); it < vec.end(); it++)
{
if(it->getName() == name)
{
return it - vec.begin();
}
}
return -1;
}
请注意,我通过常量引用而不是值传递向量,这样可以防止在调用此函数时对向量进行不必要的复制。 此外,您应该使用-1而不是0指示失败,因为如果您要查找的字符串位于向量的第一个元素中,后者是合法的结果。