43

resize(n)C++ 标准似乎没有说明, withn < size()或对容量的副作用 clear()

push_back它确实对和pop_back- O(1)的摊余成本做出了声明

我可以设想一个实现通常的容量更改 ala CLRS 算法(例如,放大时加倍,减小时减半size to < capacity()/4)。(Cormen Lieserson Rivest Stein)

有没有人有任何实施限制的参考?

4

4 回答 4

56

以较小的大小调用resize()对 a 的容量没有影响vector。它不会释放内存。

从 a 中释放内存的标准习惯用法vector是给swap()它一个空的临时vector: std::vector<T>().swap(vec);。如果要向下调整大小,则需要从原始向量复制到新的本地临时向量,然后将生成的向量与原始向量交换。

更新: C++11shrink_to_fit()为此添加了一个成员函数,它是一个非绑定请求归约capacity()size().

于 2009-07-20T20:14:57.030 回答
30

实际上,该标准确实指定了应该发生的情况:

这是来自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()没有影响。

于 2009-07-20T20:16:32.660 回答
7

容量永远不会减少。我不确定标准是否明确说明了这一点,但这是暗示的:迭代器和对向量元素的引用不能被resize(n)if无效n < capacity()

于 2009-07-20T20:36:03.573 回答
0

当我检查 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()
}
于 2011-10-20T12:00:41.693 回答