我担心标准库容器会在其内部存储我推入其中的所有元素的副本。我希望他们使用引用或指向我的元素,所以他们不会浪费额外的内存和时间来复制每个元素。我做了这个证明:
queue<int> prueba;
int x = 5;
prueba.push(x);
x++;
cout << prueba.front() << ", ";
cout << x;
prueba.pop();
结果是:5,6。
所以,如果我创建一个包含大量重要成员的大类,然后,我将该类的许多对象推送到标准库容器中。
容器会在里面制作每个对象的副本吗?这太可怕了!
有没有办法避免这种灾难性的结局,除了只创建指针容器?
答案 0 :(得分:4)
- STL结构是否存储副本或引用?
醇>
对象不“知道”并包含有关要存储的容器的详细信息。例如:
struct Node { T data; }1。优点:
- 不包含有关容器集成的其他信息。
- 由容器管理的对象的生命周期。 (不太复杂。)
2。缺点:
- 存储用户传递的值的副本。(可以进行
emplace
构建。)- 一个对象只能属于一个容器。 (或者容器应该存储指向对象的指针。)
- 存储副本的开销。 (每次分配的簿记。)
- 无法存储派生对象并仍保持其原始类型。 (切片 - 失去多态性。)
因此,您的问题的答案是 - 他们存储副本。
- 除了创建指针容器之外,有没有办法避免这种灾难性的结束?
醇>
据我所知,合理的解决方案是智能指针的容器。
答案 1 :(得分:2)
您的问题的答案很简单:STL容器存储副本。