2017-06-12 60 views
-6

我必須創建一個向量,其中包含另一個向量的選定元素。在一個向量中進行的更改也應反映在另一個向量中。所以我必須使用我打算複製的元素的參考。如何獲得一個向量中元素的引用

例如,

std::vector<int> a{1,2,3,4,5,6}; 
std::vector<int> b; 

假設如果我參考複製奇數號碼b矢量,b將包含1,3和5,如果我改變b值,同樣的變化應a可以看出矢量也。

在STL中這樣做的方法是什麼?

編輯:
我是在假設相同的內存地址位置可以由多個變量共享。
上述代碼的目的是將未知變量的較小向量傳遞給需要解決的外部求解器。由於更改將在更大的矢量中自動更新,因此我不需要跟蹤它。看來我必須使用指針來達到上述目的。

+6

這很危險。添加新元素時,「std :: vector」可能會重新分配其內部緩衝區。因此,'b'將失去其參考。順便說一句。我曾經回答過一個類似的問題:[現有對象向量](https://stackoverflow.com/questions/42039110/vector-of-existing-objests/42039844#42039844)。 (它使用user2079303提出的'std :: reference_wrapper'。) – Scheff

+0

爲什麼你首先需要第二個向量?如果你想修改'a'中的所有奇數條目,那麼在我的程序較大的向量中更簡單地修改'a' – user463035818

+0

@ tobi303中的奇數條目是未解決的變量,我將傳遞它的一些元素(較小的向量)到外部庫來解決這些變量。 – hisham

回答

3

如果我改變b的值,同樣的變化也應該在向量中看到。

然後b不應該包含整數,而是引用。因此模板類型參數是錯誤的。你想要引用,而不是整數。

但是,引用不能存儲在容器中。解決方法很簡單:您可以使用std::reference_wrapper這種情況,這是包裝的目的。你也可以使用指針,但指針可以是空的,你可能想避免。

請記住要注意向量的文檔。尤其要參考這裏非常相關的無效規則。

+0

如果您不修改原始矢量的狀態,可能希望包含此功能。否則,這些參考可能會失效。 – NathanOliver

+0

@NathanOliver我已經添加了一個提及。 – user2079303

相關問題