0

如果我使用标准库函数在向量中搜索值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在发现我不确定的情况下,它会取消引用迭代器。很明显,整个要点是让函数充当左值。它当然可以编译,但我不确定它是否正确。

4

2 回答 2

2

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

于 2013-09-27T20:04:10.863 回答
1

在这两种情况下都可以。

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

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

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

于 2013-09-27T20:07:49.273 回答