C++官网参考链接:https://cplusplus.com/reference/list/list/resize/
公有成员函数
<list>
std::list::resize
C++98
void resize (size_type n, value_type val = value_type());
C++11
void resize (size_type n);
void resize (size_type n, const value_type& val);
改变大小
调整容器的大小,使其包含n个元素。
如果n小于当前容器的size,则内容将减少到其前n个元素,删除超出的元素(并销毁它们)。
如果n大于当前容器的size,则内容将被扩展,在结束处插入所需的元素,以达到n的大小。如果指定了val,则将新元素初始化为val的副本,否则将对它们进行值初始化。
注意,此函数通过插入或删除容器中的元素来更改容器的实际内容。
形参
n
新的容器大小,以元素数量表示。
成员类型size_type是无符号整型。
val
对象,如果n大于当前容器的size,则将其内容复制到添加的元素中。
如果未指定,则使用默认构造函数。
成员类型value_type是容器中元素的类型,在list中定义为第一个模板形参(T)的别名。
返回值
没有返回值。
在增长的情况下,使用容器的allocator分配新元素的存储空间,这可能在失败时抛出异常(对于默认的allocator,如果分配请求不成功,则抛出bad_alloc)。
用例
// resizing list
#include <iostream>
#include <list>
int main ()
{
std::list<int> mylist;
// set some initial content:
for (int i=1; i<10; ++i) mylist.push_back(i);
mylist.resize(5);
mylist.resize(8,100);
mylist.resize(12);
std::cout << "mylist contains:";
for (std::list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
该代码将9个数字的序列设置为mylist的初始内容。然后,它首先使用resize将容器大小设置为5,然后将其大小扩展为8,新元素的值为100,最后将其大小扩展为12,并使用默认值(对于int型元素,这是0)。输出:
mylist contains: 1 2 3 4 5 100 100 100 0 0 0 0
复杂度
如果容器增长,则插入的元素(构造函数)数量中的线性。
如果容器缩小,则删除的元素(销毁)数量中的线性,加上最多size(iterator前进)中的线性。
iterator的有效性
指向被函数删除的元素的iterator、指针和reference将失效。
所有其他iterator、指针和reference都保持它们的有效性。
数据竞争
完成容器的修改。
删除的元素被修改。同时访问或修改其他元素是安全的。
异常安全
如果操作减小了容器的大小,则该函数永远不会抛出异常(无抛出保证)。
否则,如果抛出异常,则容器将保留有效状态(基本保证):构造元素或分配存储都可能抛出。