【发布时间】:2015-11-13 07:39:37
【问题描述】:
我想创建一个对象,将该对象放入vector,并且仍然能够通过仅访问vector 来修改同一个对象。但是,我知道当一个对象是push_back() 到vector 时,该对象实际上被复制到vector 中。因此,访问vector 中的对象只会访问一个相似但不同的对象。
我有一个C初学者的知识,所以我知道我可以创建一个指向对象的指针,并制作一个指针向量。例如vector<Object *>。但是,似乎pointers 是 C++ 中的 discouraged 和 references are preferred。然而,I cannot make a vector of references。
我希望只使用标准库,所以boost 对我来说是禁区。
我听说过智能指针。但是,似乎存在多种类型的智能指针。为了这个目的,这不是矫枉过正吗?如果智能指针确实是答案,那么我如何确定使用哪一个?
所以我的问题是:创建指向对象的引用/指针向量的标准做法是什么?
换句话说,希望下面的(伪)代码能够工作。
#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;
class Object
{
public:
int field;
};
vector<Object> addToVector(Object &o)
{
vector<Object> v;
v.push_back(o);
v[0].field = 3; // I want this to set o.field to 3.
return v;
}
int main()
{
Object one;
one.field = 1;
cout << one.field << endl; // 1 as expected
Object &refone = one;
refone.field = 2;
cout << one.field << endl; // 2 as expected
vector<Object> v = addToVector(one);
cout << v[0].field << endl; // 3 as expected
cout << one.field << endl; // I want to get 3 here as well, as opposed to 2.
return 0;
}
【问题讨论】:
-
指针向量没有问题,只要向量不需要担心它们指向的对象的生命周期。
-
使用智能指针向量代替。我很确定这个问题是重复的。
-
很抱歉,如果它是重复的。我发现与我类似的唯一问题是建议使用 boost,我希望避免。如果这确实是重复的,请告诉我。
-
只使用一个指针向量。这里不需要智能指针。一推,您可以使用
std::reference_wrapper<Object>。 -
解决你原来的问题的方法是使用
vector::emplace_back,它已经在C++11中引入。它根据参数列表在向量内创建一个对象;例如,v.emplace_back()(带有一个空参数列表)使用默认构造函数(或非类类型的值初始化)在向量中创建一个新对象。该对象不会被复制或移动到向量中,它是就地创建的。
标签: c++ pointers vector reference standard-library