2014-09-01 79 views
-1

在下面的代碼中,無論何時將新成員插入std::vector<int>A,由於內存重新分配,std::vector<reference_wrapper<int>>B都指向錯誤的地址。是否有可能使引用向量跟蹤重新分配並始終保存正確的地址?重新分配後的地址更改

#include <iostream> 
#include <functional> 
#include <vector> 
using namespace std; 

int main() 
{ 
    vector<int> A (0,3); 
    vector<reference_wrapper<int>> B; 
    B.push_back (ref(A[0])); 
    B.push_back (ref(A[1])); 
    B.push_back (ref(A[2])); 

    A.push_back (0); 

    cout << &A[0] << endl; 
    cout << &B[0].get() << endl; 

    return 0; 
} 
+0

這是什麼用途?你不能只保存迭代器而不是引用? – cerkiewny 2014-09-01 10:17:43

+0

@cerkiewny迭代器也會失效。 – juanchopanza 2014-09-01 10:18:01

+1

@cerkiewny:這會有幫助嗎?迭代器通常至少與引用一樣無效。 – 2014-09-01 10:18:40

回答

1

我看到的唯一的辦法就是保留足夠的內存,當一個新的元素被推回前提是你不刪除或插入的矢量的中間分子就不會被重新分配的載體。

考慮到這種說法

vector<int> A (0,3); 

是錯誤的。

必須有

vector<int> A (3,0); 

或者乾脆

vector<int> A (3); 

你可以寫

#include <iostream> 
#include <functional> 
#include <vector> 
using namespace std; 

int main() 
{ 
    vector<int> A(3); 
    A.reserve(4); 

    vector<reference_wrapper<int>> B; 

    B.push_back (ref(A[0])); 
    B.push_back (ref(A[1])); 
    B.push_back (ref(A[2])); 

    A.push_back (0); 

    cout << &A[0] << endl; 
    cout << &B[0].get() << endl; 

    return 0; 
} 

輸出可以像

0x9cbd018 
0x9cbd018 
0

您沒有指定此模式的實際用法。所以這裏有一些可能的解決方案:

  1. 存儲索引而不是引用/迭代器。
  2. 將A更改爲不會使實際更改的迭代器失效的列表或deque。
  3. 動態分配所有整數(例如std::shared_ptr<int>),並讓A和B都存儲(共享)指針。