【发布时间】:2010-04-13 09:17:39
【问题描述】:
如果我在向量上使用 .reserve(items),向量将分配足够的内存来猜测我需要的项目数。
如果我稍后使用 .clear(),那只是清除向量还是保存我之前定义的储备?
谢谢。
【问题讨论】:
-
不,不是,这个问题甚至没有提及
clear()。唯一使用“明确”一词的地方是在以“我不清楚如果...”开头的评论中
如果我在向量上使用 .reserve(items),向量将分配足够的内存来猜测我需要的项目数。
如果我稍后使用 .clear(),那只是清除向量还是保存我之前定义的储备?
谢谢。
【问题讨论】:
clear() 。唯一使用“明确”一词的地方是在以“我不清楚如果...”开头的评论中
指定std::vector<T>::clear()影响大小。它可能不会影响容量。要重置容量,请使用 swap 技巧:
std::vector<int> v1;
// somehow increase capacity
std::vector<int>().swap(v1);
注意:由于这个旧答案仍在获得支持(因此人们阅读它),我觉得有必要添加 C++ 11 增加了std::vector<...>::shrink_to_fit(),请求向量移除未使用的容量。
【讨论】:
它可能不会释放保留的内存,尽管我认为标准中没有指定行为。
编辑:好的,刚刚检查过,标准只说后置条件是size() == 0,尽管我没有遇到不坚持的vector 实现保留的内存。
【讨论】:
不,不会的。拨打vector::capacity()试试看。
shrink_to_fit 的出现进一步证明了这一点。该标准的工作草案提到:
备注: shrink_to_fit 是一个非约束性请求 将容量()减少到大小()。 [ 注意:请求不绑定到 允许纬度 特定于实现的优化。 ——尾注]
【讨论】:
不,它不会将 reserve() 设置为 0。调用 clear() 调用每个元素的析构函数并将它们从向量中删除,使容器的大小为 0,但容量保持不变。
【讨论】:
clear() 上更改。
它不会影响底层缓冲区的大小。这就是为什么你必须使用像this 这样的技巧来真正摆脱缓冲区或使其更小。
【讨论】: