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

C++ 标准库容器结构是否存储副本或引用?,c++,c++-standard-library,C++,C++ Standard Library,我担心标准库容器会在其内部存储我推入其中的所有元素的副本。我希望它们使用指向我的元素的引用或指针,这样它们就不会浪费额外的内存和时间来复制每个元素。我做了这个证明: queue<int> prueba; int x = 5; prueba.push(x); x++; cout << prueba.front() << ", "; cout << x; prueba.pop(); 队列prueba; int x=5; 普鲁巴推(x); x+

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

queue<int> prueba;

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

x++;

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

prueba.pop();
队列prueba;
int x=5;
普鲁巴推(x);
x++;

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

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

  • STL结构是否存储副本或引用
  • C++标准容器是非指示性容器,因此具有以下属性:

    对象不“知道”并包含有关要存储在其中的容器的详细信息。例子: struct Node { T data; } 结构体类型 { T数据; } 1.赞成的意见:
    • 不包含有关容器集成的其他信息
    • 由容器管理的对象的生存期。(不太复杂。)
    2.欺骗:
    • 存储用户传递的值的副本。(可以就地
      放置
      构造。)
    • 一个对象只能属于一个容器。(或者contaier应该存储指向对象的指针。)
    • 存储副本的开销。(每次分配的簿记)
    • 无法存储派生对象并仍保持其原始类型。(切片-松开多态性。)

    因此,你的问题的答案是——它们存储副本

  • 除了创建指针容器之外,还有什么方法可以避免这种灾难性的结局吗
  • 据我所知,一个合理的解决方案是智能指针容器

  • STL结构是否存储副本或引用
  • C++标准容器是非指示性容器,因此具有以下属性:

    对象不“知道”并包含有关要存储在其中的容器的详细信息。例子: struct Node { T data; } 结构体类型 { T数据; } 1.赞成的意见:
    • 不包含有关容器集成的其他信息
    • 由容器管理的对象的生存期。(不太复杂。)
    2.欺骗:
    • 存储用户传递的值的副本。(可以就地
      放置
      构造。)
    • 一个对象只能属于一个容器。(或者contaier应该存储指向对象的指针。)
    • 存储副本的开销。(每次分配的簿记)
    • 无法存储派生对象并仍保持其原始类型。(切片-松开多态性。)

    因此,你的问题的答案是——它们存储副本

  • 除了创建指针容器之外,还有什么方法可以避免这种灾难性的结局吗

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

    是的,它们可以复制。这就是它背后的概念。否则,您实际上无法返回一个例如
    向量
    ,而其中存储的所有内容都将失效。此外,自C++11以来,许多容器都有一种构造到位机制(例如
    向量
    放置回
    )它解决了制作不必要副本的问题。如果对象在容器内,那么为什么需要容器外的另一个副本。容器拥有该对象。如果您希望它们存储指针,请将它们定义为指针的集合(最好是智能指针)。如果您将
    int x=5;普鲁巴推(x)在函数内部。函数返回后,
    prueba.front()
    会做什么?是的,它们会复制。这就是它背后的概念。否则,您实际上无法返回一个例如
    向量
    ,而其中存储的所有内容都将失效。此外,自C++11以来,许多容器都有一种构造到位机制(例如
    向量
    放置回
    )它解决了制作不必要副本的问题。如果对象在容器内,那么为什么需要容器外的另一个副本。容器拥有该对象。如果您希望它们存储指针,请将它们定义为指针的集合(最好是智能指针)。如果您将
    int x=5;普鲁巴推(x)在函数内部。函数返回后,
    prueba.front()
    您希望做什么?另一个合理的解决方案是使用就地构造和移动语义,以避免复制。@spectra您可能是对的,我主要是试图涵盖“容器部分”另一个合理的解决方案是使用就地构造和移动语义来避免复制。如果你可能是对的,我主要是试图涵盖问题的“容器部分”。