• //<vector>
    void resize (size_type n, value_type val = value_type());
  • //<vector>
    void resize (size_type n);
    void resize (size_type n, value_type val);

vector 类模板的公共成员函数。 调整容器的大小使其能够存放 n 个元素。

如果 n 比当前容器大小(Size)小,容器中的内容将被减少到只剩前 n 个元素,超出的部份将被移除(或销毁)。

如果 n 比当前容器大小(Size)大,将通过在容器尾部插入足够的元素使内容增加到 n 个元素。如果提供了 val ,新的元素将被初始化为 val 的拷贝,否则将被值初始化(Value-initialized)。

如果 n 比当前容器容量(Capacity)大,将会对已分配内存空间自动进行一次内存重分配。

void resize(size_type sz);

If sz <= size(), equivalent to erase(begin() + sz, end());. If size() < sz, appends sz - size() value-initialized elements to the sequence.

C++编程语言国际标准:ISO/IEC 14882:2011

  • n

    新的容器大小,以元素个数为单位。

    成员类型 size_type 是一个无符号型整数。

    val

    n 比容器大小大时,将会被拷贝以增加新元素。

    如果未提供该参数,将会使用元素类型的默认构造函数。

    对成员类型 value_type 是容器的元素的类型,是 vector 实例化时第一个模板参数的别名。

  • #include <iostream>
    #include <vector>
    
    int main ()
    {
        std::vector<int> foo;
    
        for (int i = 1;i < 10;i++) foo.push_back(i);
    
        foo.resize(5);
        foo.resize(8,100);
        foo.resize(12);
    
        std::cout << "foo:";
        for (int i = 0;i < foo.size();i++)
            std::cout << ' ' << foo[i];
        std::cout << std::endl;
    
        return 0;
    }

    输出

    foo: 1 2 3 4 5 100 100 100 0 0 0 0

  • 复杂度

    时间复杂度是以插入/清除元素个数为 n 的 O(n)

    当发生内存重分配时,时间复杂度是以为整个容器大小为 nO(n)

    迭代器有效性

    当发生容器压缩时,指向未被移除的元素的所有迭代器、指针及引用都将保持有效状态,而且指向的元素跟调用当前函数前所指向的相同。

    如发生容器扩展时,当未发生内存重分配,则只有末尾迭代器(End iterator)失效,否则所有与当前容器有关的迭代器、指针及引用都会失效。

    数据争用

    容器被修改。

    如果发生内存重分配,所有容器元素都将被修改。否则 n 前无任何元素被访问,并发访问或修改它们是安全的。

    异常安全性

    n 小于或等于当前容器的大小时,该函数从不抛出异常(No-throw guarantee,无异常抛出保证)。

    n 大于当前容器的大小而发生了内存重分配,且当前元素的类型或者是可拷贝的(Copyable)或者是 可无异常抛出移动的(No-throw moveable),发生异常时,容器无任何改变(Strong guarantee,强异常安全性保证)。

    否则,如果在其它情况下抛出异常,容器将处在一个有效的状态,但不保证数据是否发生改变(Basic guarantee,基本异常保证)。