std ::引用的向量

时间:2014-05-06 07:19:48

标签: c++ vector stl

我有这样的问题:我有班级Foo,如果有这个班级的一些对象,

Foo a();

我需要将此对象放到两个不同的向量中:

std::vector<Foo> vA, vB;

如果a中的vA发生了变化,则应在vB中进行更改,向量vAvB可能会有所不同,但它们可以具有相同的对象。我知道可以使用Boost,但我无法使用Boost。

3 个答案:

答案 0 :(得分:47)

有一些可能性:

  1. 存储指针向量(如果你的向量共享指针的所有权,则使用):

    std::vector<std::shared_ptr<Foo>> vA, vB;
    
  2. 存储包装引用的向量(如果向量不共享指针的所有权,则使用,并且您知道引用的对象在生命周期内有效向量):

    std::vector<std::reference_wrapper<Foo>> vA, vB;
    
  3. 存储原始指针的向量(如果您的向量不共享指针的所有权,则使用,和/或存储的指针可能会根据其他因素而改变):

    std::vector<Foo*> vA, vB;
    

    这通常用于观察,跟踪分配等。原始指针的常见警告适用:不要在生命周期结束后使用指针访问对象。

  4. 存储包裹对象的std::unique_ptr向量(如果你的向量想要移交指针的所有权,则使用这种情况,在这种情况下,引用对象的生命周期受到管理根据{{​​1}}类的规则:

    std::unique_ptr

答案 1 :(得分:10)

您需要一个参考向量。既然你指定需要使用std :: vector,那么正确的做法是将对象包装在std::reference_wrapper中。 This page from C++ reference应该很好地解释一下:

vector<reference_wrapper<Foo>> vA, vB;
vA.push_back(a);
vB.push_back(a);    // puts 'a' into both vectors

// make changes to 'a'
// use .get() to get the referenced object in the elements of your vector
// vA[0].get() == vB[0].get()

答案 2 :(得分:2)

不要将Foo保持为对象,而是保持指向对象Foo的指针,例如

std::vector<Foo *> vA, vB;

并仔细管理分配和解除分配以避免内存泄漏(分配但不完全取消分配)。如果你分配一个Foo对象并将指针保持在vA和vB中,那么你通过指针在两者中保持基本相同的对象。 否则你可以使用智能指针(更好) 参考:

What is a smart pointer and when should I use one?