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您可能是对的,我主要是试图涵盖“容器部分”另一个合理的解决方案是使用就地构造和移动语义来避免复制。如果你可能是对的,我主要是试图涵盖问题的“容器部分”。