resize(n)
C++ 标准似乎没有说明, withn < size()
或对容量的副作用
clear()
。
push_back
它确实对和pop_back
- O(1)的摊余成本做出了声明
我可以设想一个实现通常的容量更改 ala CLRS 算法(例如,放大时加倍,减小时减半size to < capacity()/4
)。(Cormen Lieserson Rivest Stein)
有没有人有任何实施限制的参考?
以较小的大小调用resize()
对 a 的容量没有影响vector
。它不会释放内存。
从 a 中释放内存的标准习惯用法vector
是给swap()
它一个空的临时vector
: std::vector<T>().swap(vec);
。如果要向下调整大小,则需要从原始向量复制到新的本地临时向量,然后将生成的向量与原始向量交换。
更新: C++11shrink_to_fit()
为此添加了一个成员函数,它是一个非绑定请求归约capacity()
到size()
.
实际上,该标准确实指定了应该发生的情况:
这是来自vector
,但所有容器的主题都是相同的(list
,deque
等...)
23.2.4.2 向量容量[lib.vector.capacity]
void resize(size_type sz, T c = T());
6) 效果:
if (sz > size())
insert(end(), sz-size(), c);
else if (sz < size())
erase(begin()+sz, end());
else
; //do nothing
也就是说:如果指定的大小resize
小于元素的个数,这些元素将从容器中删除。关于capacity()
,这取决于erase()
对它做了什么。
我无法在标准中找到它,但我很确定clear()
它被定义为:
void clear()
{
erase(begin(), end());
}
因此,对它的影响clear()
也与对它capacity()
的影响erase()
有关。根据标准:
23.2.4.3 矢量修饰符 [lib.vector.modifiers]
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
4) 复杂性:T的析构函数被调用的次数等于被擦除元素的次数......
这意味着元素将被破坏,但内存将保持不变。erase()
对容量没有影响,因此resize()
也clear()
没有影响。
容量永远不会减少。我不确定标准是否明确说明了这一点,但这是暗示的:迭代器和对向量元素的引用不能被resize(n)
if无效n < capacity()
。
当我检查 gcc (mingw) 时,释放向量容量的唯一方法是 mattnewport 所说的。将其与其他临时向量交换。此代码使其适用于 gcc。
template<typename C> void shrinkContainer(C &container) {
if (container.size() != container.capacity()) {
C tmp = container;
swap(container, tmp);
}
//container.size() == container.capacity()
}