public member function
<vector>

std::vector::assign

range (1)
template <class InputIterator>  void assign (InputIterator first, InputIterator last);
fill (2)
void assign (size_type n, const value_type& val);
range (1)
template <class InputIterator>  void assign (InputIterator first, InputIterator last);
fill (2)
void assign (size_type n, const value_type& val);
initializer list (3)
void assign (initializer_list<value_type> il);
Assign vector content
为 vector 重新赋值,替换其当前内容,并相应地修改其 size

在*范围版本* (1) 中,新内容是通过从 firstlast 之间的序列的每个元素构造而来的元素,顺序与原序列相同。

在*填充版本* (2) 中,新内容是 n 个元素,每个元素都初始化为 val 的副本。

如果发生重新分配,则使用内部分配器分配所需的存储。
在*范围版本* (1) 中,新内容是通过从 firstlast 之间的序列的每个元素构造而来的元素,顺序与原序列相同。

在*填充版本* (2) 中,新内容是 n 个元素,每个元素都初始化为 val 的副本。

在*初始化列表版本* (3) 中,新内容是初始化列表参数值的副本,顺序与原列表相同。

如果发生重新分配,则使用内部分配器(通过其特征)来分配释放存储。它还用于销毁所有现有元素,并构造新元素。

容器中原有的所有元素都会被*销毁*,并被新构造的元素替换(不进行元素赋值)。

如果新 vector 的 size 超出了当前 vector 的 capacity,则会(仅在此条件下)自动重新分配已分配的存储空间。

参数

first, last
指向序列中初始和结束位置的输入迭代器。使用的范围是[first,last),它包括firstlast之间的所有元素,包括first指向的元素,但不包括last指向的元素。
函数模板参数InputIterator应该是指向某个类型的元素的输入迭代器类型,该类型可以转换为value_type对象的类型的元素。
n
容器的新大小。
成员类型size_type是一种无符号整型类型。
val
用于填充容器的值。容器中的每个 n 个元素都将初始化为该值的副本。
成员类型value_type是容器中元素的类型,在vector中定义为其第一个模板参数(T).
il
一个 initializer_list 对象。编译器将自动从初始化列表声明器创建此类对象。
成员类型value_type是容器中元素的类型,在vector中定义为其第一个模板参数(T).

返回值



示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// vector assign
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> first;
  std::vector<int> second;
  std::vector<int> third;

  first.assign (7,100);             // 7 ints with a value of 100

  std::vector<int>::iterator it;
  it=first.begin()+1;

  second.assign (it,first.end()-1); // the 5 central values of first

  int myints[] = {1776,7,4};
  third.assign (myints,myints+3);   // assigning from array.

  std::cout << "Size of first: " << int (first.size()) << '\n';
  std::cout << "Size of second: " << int (second.size()) << '\n';
  std::cout << "Size of third: " << int (third.size()) << '\n';
  return 0;
}
输出
Size of first: 7
Size of second: 5
Size of third: 3


复杂度

对初始和最终大小(销毁、构造)是线性的。
另外,在*范围版本 (1)* 中,如果InputIterator至少不是前向迭代器类别(即,它只是一个输入迭代器),则无法提前确定新容量,并且该操作会增加额外的对数复杂度(与新大小相关)(增长过程中的重新分配)。

迭代器有效性

所有与该容器相关的迭代器、指针和引用都将失效。

数据竞争

所有复制的元素都会被访问。
容器被修改。
所有包含的元素都被修改。

异常安全

基本保证:如果抛出异常,容器仍处于有效状态。
如果不支持带有适当参数的 allocator_traits::construct 进行元素构造,或者指定的范围由[first,last)无效,则会导致未定义行为

另见