2013-09-27 57 views
0

如果我使用标准库find()函数搜索某个值的向量,下面的代码是否会返回适当的引用?如果搜索在矢量中找到所需的值,它应该返回对该值的引用。如果没有,它应该将值推到最后并返回对新值的引用。从搜索STL向量的函数中返回一个引用

我看不出来。返回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

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

+0

“或元素被重新定位,例如,由于调整的载体” - 如此特别,如果你调用'foo'然后两次第二个电话后,第一次调用的结果可能不是仍然有效。在不改变函数含义的情况下,为了避免这种情况,你唯一能做的就是用'deque'替换'vector'。 –

+0

我将不得不考虑失败案例。在真正的代码中,这是一个稀疏矩阵类的括号运算符重载。参考资料应该足够长,以便分配,但是我无法控制别人可能用它做什么。 – Fadecomic

1

这两种情况都可以。

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

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

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

相关问题