C++ find in vector

C++ find in vector

本文关键字:vector in find C++      更新时间:2023-10-16

我试图做函数,返回在向量中发现的位置。但是我的返回值总是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;
        }
    }
}

当您的第一个元素不匹配时,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(这永远不会是有效的向量索引)。

你的'else'子句就是问题所在:如果第一个元素不匹配,'else'就会启动,而你的'return 0'语句将跳出'for'循环,而不尝试vector中的任何其他元素。

试着去掉'else',并将'return 0'移动到 for循环结束后的

由于当前的编写方式,您的函数将始终返回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来指示失败,因为如果您要查找的字符串位于vector的第一个元素中,后者是合法的结果。