【问题标题】:C++ find in vectorC++ 在向量中查找
【发布时间】:2011-10-12 04:23:29
【问题描述】:

我正在尝试执行返回在向量中出现的位置的函数。但是我的返回值始终是 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;
        }

    }
}

【问题讨论】:

  • 为什么不将std::find_if 与自定义谓词一起使用?

标签: c++ stl vector iterator find


【解决方案1】:

您的“else”子句是问题所在:如果第一项不匹配,则“else”开始执行,而您的“return 0”语句将您从“for”循环中中断,而无需尝试任何向量中的其他元素。

尝试去掉“else”,并将“return 0”移动到“for”循环结束之后。

【讨论】:

  • 哦,我刚刚注意到了。愚蠢的错误。
  • 也永远不会调用 return 之后的 break
  • 此外,Vitus 有一个非常好的观点,即如果没有匹配项,则返回 -1 而不是 0。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 真正解决“未找到”问题的方法是使用迭代器并返回结束迭代器。当然,这只是std::find
    猜你喜欢
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多