C ++在向量中找到

时间:2011-07-24 20:45:51

标签: c++ stl vector iterator find

我正在尝试执行将返回在向量中找到事件的位置的函数。但我的返回值始终为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;
        }

    }
}

3 个答案:

答案 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指示失败,因为如果您要查找的字符串位于向量的第一个元素中,后者是合法的结果。