STL:存储引用或值?

jam*_*o00 12 c++ stl reference vector

关于STL容器(vector,list,map ...)如何存储值,我总是有点困惑.他们存储对我传入的值的引用,还是复制/复制构造+存储值本身?

例如,

int i;
vector<int> vec;
vec.push_back(i);
// does &(vec[0]) == &i;
Run Code Online (Sandbox Code Playgroud)

class abc;
abc inst;
vector<abc> vec;
vec.push_back(inst);
// does &(vec[0]) == &inst;
Run Code Online (Sandbox Code Playgroud)

谢谢

Mic*_*val 18

STL容器复制 - 构造和存储您传入的值.如果您想将对象存储在容器中而不复制它们,我建议在容器中存储指向该对象的指针:

class abc;
abc inst;
vector<abc *> vec;
vec.push_back(&inst);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 您无法创建在C++中存储引用的创建容器.传递给容器的类型参数必须是可分配的.引用不可分配,它们使用对象初始化,但在构造后不能分配给引用不同的对象.因此,引用类型不满足在容器内使用的类型要求.如果你想拥有相同的语义(或尽可能接近),你必须提供一个引用包装器(boost :: ref/boost :: cref) (5认同)
  • @dribeas:这个答案通过解释假设实施的风险来解释_why not_. (3认同)