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
替换向量。在实际代码中,这是稀疏矩阵类的括号运算符重载。引用应该在那里足够长的时间来分配任务,但是我无法控制其他人会如何处理它。