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

时间:2013-09-27 19:59:55

标签: c++ stl reference

如果我使用标准库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我不确定的情况下,它会取消引用迭代器。可能很明显的一点是,要使函数充当左值。它肯定会编译,但我不确定它是否正确。

2 个答案:

答案 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()返回引用。

你也可以将它们作为参考文献归还。