C++ Reference: Standard C++ Library reference: Containers: list: list: resize

巴星华
2023-12-01

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都保持它们的有效性。

数据竞争
完成容器的修改。
删除的元素被修改。同时访问或修改其他元素是安全的。

异常安全
如果操作减小了容器的大小,则该函数永远不会抛出异常(无抛出保证)。
否则,如果抛出异常,则容器将保留有效状态(基本保证):构造元素或分配存储都可能抛出。 

 类似资料: