2013-09-27 81 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()返回一個引用。

您也可以將它們作爲參考返回。

相關問題