C++ 为什么不在GotW 54中调整大小并清除工作?
参考赫布萨特的文章,他解释了C++ 为什么不在GotW 54中调整大小并清除工作?,c++,vector,deque,gotw,C++,Vector,Deque,Gotw,参考赫布萨特的文章,他解释了 “收缩到适合”a的正确方法 向量或deque和 完全清除向量或 德克 我们可以只使用container.resize() 和container.clear()用于上述任务 还是我遗漏了什么 向量包含两种不同的内容:sizeVscapacity。如果只调整向量的大小,则无法保证容量(保留的内存量)必须更改调整大小是一项与使用多少有关的操作,而不是向量容量的多少 比如说 size == how much you are using capacity == how
container.resize()
和container.clear()
用于上述任务
还是我遗漏了什么
向量包含两种不同的内容:
size
Vscapacity
。如果只调整向量的大小,则无法保证容量(保留的内存量)必须更改<代码>调整大小是一项与使用多少有关的操作,而不是向量容量的多少
比如说
size == how much you are using
capacity == how much memory is reserved
vector<int> v(10);
v.resize(5); // size == 5 but capacity (may or may) not be changed
v.clear() // size == 0 but capacity (may or may) not be changed
size==您正在使用的数量
容量==保留的内存量
向量v(10);
v、 调整大小(5);//大小==5,但容量(可能或可能)不变
v、 clear()//大小==0,但容量(可以更改,也可以不更改)
最后,容量不应该在每个操作上都改变,因为这将带来大量内存分配/释放开销。他是说,如果您需要按向量“解除分配保留的内存,请这样做。向量具有大小和容量。它可能包含X个元素,但存储了Y个元素的未初始化内存。在一个典型的实现中,擦除、调整大小(当调整到较小的大小时)和清除不会影响容量:如果您以后想向向量中添加新的项,则向量本身会保留内存。调整大小()和清除()都不起作用。向量的
.capacity()
保证至少与向量的当前size()
一样大,并且保证至少与reserve()
d容量一样大。此外,这个。capacity()
不会收缩,因此它至少与以前的任何size()
或reserve()一样大
现在,向量的.capacity()
仅仅是它保留的内存。通常并非所有的记忆都包含对象。调整大小会删除对象,但不会回收内存。当分配较大的缓冲区时,向量只能回收其内存缓冲区
交换技巧的工作原理是将所有对象复制到更小、更合适的内存缓冲区。之后,可以回收原始内存缓冲区。这似乎违反了前面的语句,即向量的内存缓冲区只能增长。但是,使用交换技巧,您暂时拥有2个向量。我认为容量也会改变:-(请注意,即使将向量调整为更大的大小,容量也可能不会改变,因为可能只有足够的内存来处理新的(更大的)大小。