我一直对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;
感谢。我一直对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;
感谢。STL容器会复制构造并存储传入的值。如果你想在容器中存储对象但是不想复制它们,我建议在容器中存储指向对象的指针:
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
的引用,会很危险,因为在从定义该变量的方法返回后,您将引用局部变量的内存位置。
这取决于你的类型。如果它是一个简单值类型,并且复制成本低廉,那么存储值可能是答案。另一方面,如果它是引用类型或复制成本高昂,则最好存储智能指针(不要使用auto_ptr,因为它的特殊复制语义会防止其被存储在容器中。选择shared_ptr)。使用裸指针会冒着内存泄漏和访问已释放内存的风险,而使用引用则冒着后者的风险。智能指针避免了这两个问题。