STL:存储引用或值?

时间:2009-09-05 06:29:28

标签: c++ stl reference vector

我一直对STL容器(vector,list,map ...)如何存储值感到困惑。他们存储对我传入的值的引用,还是复制/复制构造+存储值本身?

例如,

int i;
vector<int> vec;
vec.push_back(i);
// does &(vec[0]) == &i;

class abc;
abc inst;
vector<abc> vec;
vec.push_back(inst);
// does &(vec[0]) == &inst;

由于

2 个答案:

答案 0 :(得分:18)

STL容器复制构造并存储您传入的值。如果要将对象存储在容器中而不复制它们,我建议在容器中存储指向该对象的指针: / p>

class abc;
abc inst;
vector<abc *> vec;
vec.push_back(&inst);

这是实现容器类的最合理的方法,以防止在已停止的堆栈帧上意外存储对变量的引用。考虑:

class Widget {
public:
    void AddToVector(int i) {
        v.push_back(i);
    }
private:
    vector<int> v;
};

存储对i的引用将是危险的,因为在从定义它的方法返回后,您将引用局部变量的内存位置。

答案 1 :(得分:4)

这取决于你的类型。如果它是一个简单的值类型,并且便宜复制,那么存储值可能就是答案。另一方面,如果它是一个引用类型,或复制起来很昂贵,你最好存储一个智能指针(而不是auto_ptr,因为它的特殊复制语义阻止它存储在容器中。转到shared_ptr)。使用普通指针会冒内存泄漏和访问释放内存的风险,而使用引用会冒后者的风险。智能指针可以避免这两种情况。