C++向量减少分配大小

5

C++向量在实践中何时动态减少其分配的大小。

我知道当插入一个已满的向量时,分配的空间会加倍,但是我不清楚何时会减少分配。经典的迟滞现象是在从1/4满的向量中移除元素时将分配大小减半。


1
标准并不要求重新分配时必须加倍容量,它只是暗示生长必须是几何级数才能实现平摊常数时间的插入。但任何增长因子α > 1都能符合这个要求。 - 5gon12eder
3个回答

7

如果没有明确的指示,它不会缩小已分配的内存。

C++11中有一个shrink_to_fit方法,可以要求实现这样做,但它可能不会减少已分配的内存。在之前的版本中,您必须创建一个新副本并交换旧副本。


3
即使调用shrink_to_fit方法,也不能保证一定会减小容量(这只是一个非强制性的请求)。 - vsoftco
1
“先前版本”技术通常采用以下形式:std::vector<T>(vec).swap(vec); - Drew Dormann
2
@DrewDormann:他们仍然没有任何保证! - Lightness Races in Orbit

2
至少在我的编译器中,向量似乎不会减少它们分配的空间。 当我运行以下代码时:
        std::vector<int> v;
        for(unsigned x=0;x<20;++x)
        {
            v.push_back(x);
            out << "elements: " << v.size() << ", capacity: " << v.capacity() << std::endl;
        }
        for(unsigned x=v.size();x>0;--x)
        {
            v.pop_back();
            out << "elements: " << v.size() << ", capacity: " << v.capacity() << std::endl;
        }

返回的是什么:
    elements: 1, capacity: 1
    elements: 2, capacity: 2
    elements: 3, capacity: 4
    elements: 4, capacity: 4
    elements: 5, capacity: 8
    elements: 6, capacity: 8
    elements: 7, capacity: 8
    elements: 8, capacity: 8
    elements: 9, capacity: 16
    elements: 10, capacity: 16
    elements: 11, capacity: 16
    elements: 12, capacity: 16
    elements: 13, capacity: 16
    elements: 14, capacity: 16
    elements: 15, capacity: 16
    elements: 16, capacity: 16
    elements: 17, capacity: 32
    elements: 18, capacity: 32
    elements: 19, capacity: 32
    elements: 20, capacity: 32
    elements: 19, capacity: 32
    elements: 18, capacity: 32
    elements: 17, capacity: 32
    elements: 16, capacity: 32
    elements: 15, capacity: 32
    elements: 14, capacity: 32
    elements: 13, capacity: 32
    elements: 12, capacity: 32
    elements: 11, capacity: 32
    elements: 10, capacity: 32
    elements: 9, capacity: 32
    elements: 8, capacity: 32
    elements: 7, capacity: 32
    elements: 6, capacity: 32
    elements: 5, capacity: 32
    elements: 4, capacity: 32
    elements: 3, capacity: 32
    elements: 2, capacity: 32
    elements: 1, capacity: 32
    elements: 0, capacity: 32

它们不会自动降低优化容量(这需要时间)。 - vsoftco

0
在C++11之前,您可以通过给向量分配一个新值来清空它:
vector<int> x;
x.resize(500);
x = vector<int>(); // assigning a copy of new empty vector will shrink memory usage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接