如何调用具有类型向量的参数:int::迭代器和C++?

如何调用具有类型向量的参数:int::迭代器和C++?,c++,C++,我有一个在迭代器范围内查找数字的方法,如下所示。我希望它有引用参数并返回迭代器的引用 // find number in range of begin and end, if number found return reference of iterator, throw exception otherwise vector<int>::iterator &find_int(vector<int>::iterator &begin, vector<i

我有一个在迭代器范围内查找数字的方法,如下所示。我希望它有引用参数并返回迭代器的引用

// find number in range of begin and end, if number found return reference of iterator, throw exception otherwise
vector<int>::iterator &find_int(vector<int>::iterator &begin, vector<int>::iterator &end, int &number)
{
    for (; begin != end; ++begin)
    {
        if (*begin == number)
        {
            return begin;
        }
    }

    throw "not found";
}

该函数实际上不应该使用迭代器&'s或int&1。它应该按值获取参数,并按值返回迭代器

即使您没有因为试图在需要int&1的地方传递int-literal而导致编译器错误,您不能以这种方式调用它的原因是,您将传递一个对临时值的引用,然后通过函数的返回值获取对该临时值的引用,在下一行代码中,引用将引用一个已销毁的对象

你可以这样称呼它:

vector<int>::iterator beg = vi1.begin(), end = vi1.end();

vector<int>::iterator& pos = find_int(beg, end, 5);
请注意&pos==&beg

然而,如果这不是一个说教性的练习,我建议按照shuttle87的建议去做,也就是使用std::find


1感谢Ghita指出这一点。

该函数实际上不应该使用迭代器&'s或int&1。它应该按值获取参数,并按值返回迭代器

即使您没有因为试图在需要int&1的地方传递int-literal而导致编译器错误,您不能以这种方式调用它的原因是,您将传递一个对临时值的引用,然后通过函数的返回值获取对该临时值的引用,在下一行代码中,引用将引用一个已销毁的对象

你可以这样称呼它:

vector<int>::iterator beg = vi1.begin(), end = vi1.end();

vector<int>::iterator& pos = find_int(beg, end, 5);
请注意&pos==&beg

然而,如果这不是一个说教性的练习,我建议按照shuttle87的建议去做,也就是使用std::find


1感谢Ghita指出这一点。

除非有什么原因您必须使用自己的代码,否则我只使用std::find like so:

  std::vector<int>::iterator it;
  // std::find returns iterator to vector element or end if not found:
  it = std::find (vi1.begin(), vi1.end(), 5);
  if(it == vi1.end()) throw "not found";

除非出于某种原因您必须使用自己的代码,否则我只会使用std::find like so:

  std::vector<int>::iterator it;
  // std::find returns iterator to vector element or end if not found:
  it = std::find (vi1.begin(), vi1.end(), 5);
  if(it == vi1.end()) throw "not found";

或使用C++ 11风格:

auto res = std::find_if(vect.begin(), vect.end(), [num](int nb) -> bool {
        return (nb == num);
    });

确保包含算法头

或使用C++ 11风格:

auto res = std::find_if(vect.begin(), vect.end(), [num](int nb) -> bool {
        return (nb == num);
    });


确保包含算法标题

这怎么不起作用?你有什么错误?@Ghita:我已经更新了我的问题,添加了错误信息。这怎么不起作用?你发现了什么错误?@Ghita:我更新了我的问题,添加了错误消息。为什么这比std::find更像C++11风格?它也可能效率较低。为什么你会说它效率较低?它更为C++ 11,因为你可以使用LAMBDASTH,这可能是不太有效的,因为它涉及到在每次迭代中调用一个函数,如果编译器不能优化它,那么它的效率就不那么高了。这也不是成为C++11的一个很好的理由,find不是二等公民。任何一个好的编译器都会内联lambda。这不像lambda函数在其他任何地方使用,所以撇开优化不谈,我看不出有任何理由不使用它。如果您考虑在给定的范围内找到第一个元素,则是非常有效的。但是,对于这种情况,AutoI= FINDINGVI1,Envi1,5比AutoI= STD::FINDIFIFIFINGVIV1,EnviV1,[NUM] int NB-> BOOL{返回NB==num;}要好得多。无论如何,+1是这个答案的替代方法。为什么这比std::find更像C++11风格?它也可能效率较低。为什么你会说它效率较低?它更为C++ 11,因为你可以使用LAMBDASTH,这可能是不太有效的,因为它涉及到在每次迭代中调用一个函数,如果编译器不能优化它,那么它的效率就不那么高了。这也不是成为C++11的一个很好的理由,find不是二等公民。任何一个好的编译器都会内联lambda。这不像lambda函数在其他任何地方使用,所以撇开优化不谈,我看不出有任何理由不使用它。如果您考虑在给定的范围内找到第一个元素,则是非常有效的。但是,对于这种情况,AutoI= FINDINGVI1,Envi1,5比AutoI= STD::FINDIFIFIFINGVIV1,EnviV1,[NUM] int NB-> BOOL{返回NB==num;}要好得多。无论如何,+1是这个答案的另一种方法。实际上,编译错误是因为您传递了一个对临时变量(例如5)的引用,并且在find_int实现中没有const int number&作为函数参数。否则,您的代码应该work@Ghita啊,没有看到&对于int参数,没有在代码块中向右滚动。谢谢。在这种情况下,通过引用传递整数类型仍然不是一个好主意,因为在这种情况下,您不会修改数字,这会使函数的意图具有欺骗性。如果您不希望整数类型成为输出值,则通过引用传递整数类型不是一个好做法,因为无论如何,函数参数在C/C++中传递的方式是通过将该int的值输入到特定函数中,如果您将引用传输到int或int,其成本基本相同。始终通过常数类型&在案例c中
对该对象进行oping是非常昂贵的,或者您希望明确您有一个仅输入的参数,或者更高的成本,因为您添加了一个间接级别,因此您可能会添加取消引用指针的时间,这比直接在堆栈上访问它更糟糕。实际上,编译错误是因为您传递了对临时文件(例如5)的引用,并且在find_int实现中没有const int number&作为函数参数。否则,您的代码应该work@Ghita啊,没有看到&对于int参数,没有在代码块中向右滚动。谢谢。在这种情况下,通过引用传递整数类型仍然不是一个好主意,因为在这种情况下,您不会修改数字,这会使函数的意图具有欺骗性。如果您不希望整数类型成为输出值,则通过引用传递整数类型不是一个好做法,因为无论如何,函数参数在C/C++中传递的方式是通过将该int的值输入到特定函数中,如果您将引用传输到int或int,其成本基本相同。始终按常量类型传递&以防该对象的处理代价很高,或者您想明确说明您有一个仅输入的参数,或者更高的代价,因为您添加了一个间接级别,所以您可能会添加取消引用指针的时间,这比直接在堆栈上访问指针更糟糕。