提问人:jdehesa 提问时间:7/12/2019 更新时间:7/12/2019 访问量:66
STL 中的容量和复制 [duplicate]
Capacity and copying in STL [duplicate]
问:
我想知道当你复制它时,像向量或字符串这样的容器的容量会发生什么。我运行了以下实验(Clang 8),但不知道会发生什么。
#include <iostream>
#include <vector>
#include <string>
int main()
{
using namespace std;
vector<int> v;
v.reserve(100);
vector<int> v2 = v;
cout << v2.capacity() << endl;
// 0
string s;
s.reserve(100);
string s2 = s;
cout << s2.capacity() << endl;
// 15
return 0;
}
所以看起来容量没有被复制。一方面,这似乎是合理的,因为让副本占用的内存超过必要的内存是浪费的。但是,另一方面,我可能期望副本具有相同的容量。也许我确实想制作几个具有一些预分配容量的向量。更一般地说,我通常希望副本的行为与复制的对象类似,粗略地说,在调用方法时返回相同的结果。我知道没有这样的规则,而且标准中肯定有很多情况不会发生这种情况。但无论如何,我想知道是否有任何关于它的规范,如果标准明确规定容器的容量不需要跨副本维护。理想情况下,我想得到一些特定的行为,例如,假设 clang 所做的是正确的(而不是保持容量),那么我想理所当然地认为容量永远不会被维护(例如,像“副本的容量是你会得到的”),尽管我认为标准会把它留给编译器。const
shrink_to_fit
答:
0赞
Vlad from Moscow
7/12/2019
#1
它是实现定义的。根据 c++ 17 标准(对于 std::basic_string,24.3.2.2 basic_string构造函数和赋值运算符)
capacity() a value at least as large as size()
评论
0赞
jdehesa
7/12/2019
对,但不是任何至少与 .例如,如果调用 ,则以 的值为条件。无论如何,从该描述中,我可以预期副本将返回相同的值。size
reserve
capacity
1赞
Vlad from Moscow
7/12/2019
@jdehesa 我不明白你说“对,但不是任何至少与大小一样大的值”是什么意思,容量和大小使用相同的类型size_type。
1赞
François Andrieux
7/12/2019
@jdehesa容量根本不被视为容器价值的一部分。如果两个容器范围内的元素相等,则两个容器相等,并且这不需要容量相等(大多数容器没有容量)。您希望一个向量 contain 等于另一个相同类型的向量,即使一个向量的容量大于另一个。{1, 2, 3}
{1, 2, 3}
评论
shared_ptr