如果我使用标准库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();
}
}
我说不出来。返回a.back()
应该没问题,因为它是定义的引用。在发现i
我不确定的情况下,它会取消引用迭代器。可能很明显的一点是,要使函数充当左值。它肯定会编译,但我不确定它是否正确。
答案 0 :(得分:2)
取消引用迭代器时,您会得到一个引用。基本上,a.back()
等同于*(a.end() - 1)
(对于具有随机访问迭代器的容器)。也就是说,该功能看起来不错。请注意,对std::vector<T>
元素的引用在向量被销毁或元素重新定位之前保持有效,例如,由于向量的大小调整。
答案 1 :(得分:1)
两种情况都可以。
Per §24.2.2/ Table 106 :对于迭代器r
,表达式*r
返回一个引用。
Per §23.3.6.1:方法back()
返回引用。
你也可以将它们作为参考文献归还。