标准库容器结构是否存储副本或引用?

时间:2017-06-17 21:56:20

标签: c++ c++-standard-library

我担心标准库容器会在其内部存储我推入其中的所有元素的副本。我希望他们使用引用或指向我的元素,所以他们不会浪费额外的内存和时间来复制每个元素。我做了这个证明:

queue<int> prueba;

int x = 5;
prueba.push(x);

x++;

cout << prueba.front() << ", ";
cout << x;

prueba.pop();

结果是:5,6。

所以,如果我创建一个包含大量重要成员的大类,然后,我将该类的许多对象推送到标准库容器中。

容器会在里面制作每个对象的副本吗?这太可怕了!

有没有办法避免这种灾难性的结局,除了只创建指针容器?

2 个答案:

答案 0 :(得分:4)

  
      
  1. STL结构是否存储副本或引用?
  2.   

C ++标准容器是非侵入式容器

,因此它们具有以下属性:

  

对象不“知道”并包含有关要存储的容器的详细信息。例如:

struct Node
{
    T data;
}
     

1。优点:

             
                  
  • 不包含有关容器集成的其他信息。
  •               
  • 由容器管理的对象的生命周期。 (不太复杂。)
  •              
     

2。缺点:

              
                  
  • 存储用户传递的值的副本。(可以进行emplace构建。)
  •               
  • 一个对象只能属于一个容器。 (或者容器应该存储指向对象的指针。)
  •               
  • 存储副本的开销。 (每次分配的簿记。)
  •               
  • 无法存储派生对象并仍保持其原始类型。 (切片 - 失去多态性。)
  •                

因此,您的问题的答案是 - 他们存储副本。

  
      
  1. 除了创建指针容器之外,有没有办法避免这种灾难性的结束?
  2.   

据我所知,合理的解决方案是智能指针的容器。

答案 1 :(得分:2)

您的问题的答案很简单:STL容器存储副本。