我有这样的问题:我有班级Foo
,如果有这个班级的一些对象,
Foo a();
我需要将此对象放到两个不同的向量中:
std::vector<Foo> vA, vB;
如果a
中的vA
发生了变化,则应在vB
中进行更改,向量vA
和vB
可能会有所不同,但它们可以具有相同的对象。我知道可以使用Boost,但我无法使用Boost。
答案 0 :(得分:47)
有一些可能性:
存储指针向量(如果你的向量共享指针的所有权,则使用):
std::vector<std::shared_ptr<Foo>> vA, vB;
存储包装引用的向量(如果向量不共享指针的所有权,则使用,并且您知道引用的对象在生命周期内有效向量):
std::vector<std::reference_wrapper<Foo>> vA, vB;
存储原始指针的向量(如果您的向量不共享指针的所有权,则使用,和/或存储的指针可能会根据其他因素而改变):
std::vector<Foo*> vA, vB;
这通常用于观察,跟踪分配等。原始指针的常见警告适用:不要在生命周期结束后使用指针访问对象。
存储包裹对象的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中,那么你通过指针在两者中保持基本相同的对象。 否则你可以使用智能指针(更好) 参考: