【问题标题】:How to get reference of elements in a vector如何获取向量中元素的引用
【发布时间】:2017-06-12 12:19:29
【问题描述】:

我必须创建一个包含另一个向量的选定元素的向量。在一个向量中所做的更改也应该反映在另一个向量中。所以我必须使用我打算复制的元素的引用。

例如,

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

假设如果我参考b 向量复制奇数,b 将包含 1,3 和 5。如果我更改 b 的值,a 向量中也应该看到相同的变化。

STL 中的方法是什么?

编辑:
我假设相同的内存地址位置可以由多个变量共享。
上述代码的目的是将较小的未知变量向量传递给要求解的外部求解器。由于更改将在较大的向量中自动更新,因此我不需要跟踪它。看来我必须为上述目的使用指针。

【问题讨论】:

  • 这很危险。当添加新元素时,std::vector 可能会重新分配其内部缓冲区。因此,b 将丢失其引用。顺便提一句。我曾经回答过一个类似的问题:vector of existing objests。 (它使用 std::reference_wrapper 由 user2079303 提议。)
  • 为什么首先需要第二个向量?如果要修改a的所有奇数条目,那么简单地修改a中的奇数条目会容易得多
  • @tobi303,在我的程序中,较大的向量是未解决的变量,我会将它的一些元素(较小的向量)传递给外部库来解决这些变量。

标签: c++ vector


【解决方案1】:

如果我改变 b 的值,同样的变化也会出现在向量中。

那么 b 不应该包含整数,而是引用。因此模板类型参数是错误的。您需要引用,而不是整数。

但是,引用不能存储在容器中。解决方法很简单:您可以使用 std::reference_wrapper 这样的情况,这就是包装器的用途。您也可以使用指针,但指针可以为 null,您可能希望避免。

请记住注意向量的文档。尤其要参考与此处非常相关的无效规则。

【讨论】:

  • 可能想要包含这个只有在你不修改原始向量的状态时才有效。否则这些引用可能会失效。
  • @NathanOliver 我已经添加了提及。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
  • 2022-01-17
相关资源
最近更新 更多