std ::引用的向量

Mik*_*aev 22 c++ stl vector

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

Foo a();
Run Code Online (Sandbox Code Playgroud)

我需要把这个对象放到两个不同的向量:

std::vector<Foo> vA, vB;
Run Code Online (Sandbox Code Playgroud)

如果a在改变vA应该改变了vB,载体vAvB可以不同,但它们可以有相同的对象.我知道可以使用Boost,但我不能使用Boost.

utn*_*tim 47

有一些可能性:

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

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

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

    std::vector<Foo*> vA, vB;
    
    Run Code Online (Sandbox Code Playgroud)

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

  4. 存储std::unique_ptr包装对象的向量(如果您的向量想要移交指针的所有权,则使用这种情况,在这种情况下,引用对象的生命周期由std::unique_ptr类的规则控制):

    std::vector<std::unique_ptr<Foo>> vA, vB;
    
    Run Code Online (Sandbox Code Playgroud)

  • 如果你创建两个向量 `std::vector&lt;std::unique_ptr&lt;Foo&gt;&gt;` 并在它们两个中插入相同的对象,不会导致双重释放吗? (2认同)
  • @АндрейБеньковский,是的,因为将相同的地址添加到两个不同的 unique_ptr 实例始终是一个无效用例(这就是为什么 unique_ptr 允许移动分配和移动构造,但不允许复制分配和复制构造)。 (2认同)

alp*_*tis 11

你需要一个参考矢量.既然你指定你需要使用std :: vector,那么正确的做法是将你的对象包装在std::reference_wrapper.来自C++参考的这个页面应该很好地解释它:

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()
Run Code Online (Sandbox Code Playgroud)