std :: vector向下调整大小

时间:2009-07-20 20:11:52

标签: c++ vector resize std stdvector

C ++标准似乎没有对容量的副作用做出任何陈述 resize(n)n < size()clear()

它确实声明了push_backpop_back的摊还成本 - O(1)

我可以设想一种实现常规容量变化的实现 ala CLRS算法(例如,放大时加倍,降低时加倍size to < capacity()/4)。 (Cormen Lieserson Rivest Stein)

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

4 个答案:

答案 0 :(得分:41)

调用较小尺寸的resize()vector的容量没有影响。它不会释放记忆。

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

更新:为此目的,C ++ 11添加了一个成员函数shrink_to_fit(),这是一个将capacity()缩减为size()的非约束性请求。< / p>

答案 1 :(得分:24)

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

这是来自vector,但所有容器的主题相同(listdeque等等。)

  

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()也没有效果。

答案 2 :(得分:6)

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

答案 3 :(得分:0)

当我检查gcc(mingw)时,释放矢量容量的唯一方法就是mattnewport所说的。 用其他teporary向量交换它。 这段代码适用于gcc。

template<typename C> void shrinkContainer(C &container) {
    if (container.size() != container.capacity()) {
        C tmp = container;
        swap(container, tmp);
    }
    //container.size() == container.capacity()
}