2017-06-12 63 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

相关问题