C++ 从搜索STL向量的函数返回引用

C++ 从搜索STL向量的函数返回引用,c++,stl,reference,C++,Stl,Reference,如果我使用标准库find()函数在向量中搜索值,下面的代码会返回正确的引用吗?如果搜索在向量中找到所需的值,则应返回对该值的引用。如果没有,则应将该值推到末尾,并返回对新值的引用 我不知道。返回a.back()应该可以,因为根据定义它是一个引用。在发现我不确定的i的情况下,它取消对迭代器的引用 int& foo(int i) { std::vector<int>::iterator found = find(a.begin(), a.end(), i);

如果我使用标准库
find()
函数在向量中搜索值,下面的代码会返回正确的引用吗?如果搜索在向量中找到所需的值,则应返回对该值的引用。如果没有,则应将该值推到末尾,并返回对新值的引用

我不知道。返回
a.back()
应该可以,因为根据定义它是一个引用。在发现我不确定的
i
的情况下,它取消对迭代器的引用

 int& foo(int i)
 {
     std::vector<int>::iterator found = find(a.begin(), a.end(), i);
     if (found != a.end())
     {
        return *found;
     } else {
        a.push_back(i);
        return a.back();
     }
 }
int&foo(inti)
{
std::vector::iterator found=find(a.begin(),a.end(),i);
如果(找到!=a.end())
{
返回*已找到;
}否则{
a、 推回(i);
返回a.back();
}
}

我不知道。返回
a.back()
应该可以,因为根据定义它是一个引用。在发现我不确定的
i
的情况下,它取消对迭代器的引用。很明显,整个要点是让函数充当左值。它当然可以编译,但我不确定它是否正确。

当取消对迭代器的引用时,您会得到一个引用。基本上,
a.back()
相当于
*(a.end()-1)
(对于具有随机访问迭代器的容器)。也就是说,该函数看起来正常。请注意,对
std::vector
元素的引用将保持有效,直到向量被销毁或元素被重新定位,例如,由于调整向量的大小。

取消引用迭代器时,您将获得一个引用。基本上,
a.back()
相当于
*(a.end()-1)
(对于具有随机访问迭代器的容器)。也就是说,该函数看起来正常。请注意,对
std::vector
元素的引用将保持有效,直到向量被销毁或元素被重新定位,例如,由于调整向量的大小。

在这两种情况下都可以

  • 根据§24.2.2/表106:对于迭代器
    r
    ,表达式
    *r
    返回一个引用

  • 根据§23.3.6.1:方法
    back()
    返回一个引用

您也可以将它们作为参考返回。

这两种情况都可以

  • 根据§24.2.2/表106:对于迭代器
    r
    ,表达式
    *r
    返回一个引用

  • 根据§23.3.6.1:方法
    back()
    返回一个引用


您也可以将它们作为引用返回。

“或者元素被重新定位,例如,由于调整向量的大小”--因此,特别是,如果在第二次调用之后调用
foo
两次,则第一次调用的结果可能仍然无效。在不改变函数含义的情况下,唯一可以避免这种情况的方法是用
deque
替换
向量。在实际代码中,这是稀疏矩阵类的括号运算符重载。引用应该在那里足够长,以便赋值,但是我无法控制其他人可能对它做什么。”或者元素被重新定位,例如,由于调整向量的大小”——因此,特别是,如果在第二次调用之后调用
foo
两次,则第一次调用的结果可能仍然无效。在不改变函数含义的情况下,唯一可以避免这种情况的方法是用
deque
替换
向量。在实际代码中,这是稀疏矩阵类的括号运算符重载。引用应该在那里足够长的时间来分配任务,但是我无法控制其他人会如何处理它。