F_JustWei's Studio.

序列容器中的 assign 方法

字数统计: 822阅读时长: 4 min
2021/05/19 Share

序列容器中的 assign 方法

本文章基于 VS2019 创作。

assign 函数的作用:将内容重新分配给容器,替换其当前内容,并相应的修改容器的大小。

序列容器包括

  • array
  • vector
  • deque
  • list
  • forward_list

其中 array 没有 assign 函数。

vector、deque、list 、forward_list 中 assign 函数的使用方式都一样,下面以 vector 为例,写出示例。

示例

第 1 种方法:
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
void assign(_CRT_GUARDOVERFLOW const size_type _Newsize, const _Ty& _Val) { // assign _Newsize * _Val
auto& _My_data = _Mypair._Myval2;
pointer& _Myfirst = _My_data._Myfirst;
pointer& _Mylast = _My_data._Mylast;

_My_data._Orphan_all();

auto _Oldsize = static_cast<size_type>(_Mylast - _Myfirst);
if (_Newsize > _Oldsize) {
const auto _Oldcapacity = static_cast<size_type>(_My_data._Myend - _Myfirst);
if (_Newsize > _Oldcapacity) { // reallocate
_Clear_and_reserve_geometric(_Newsize);
_Oldsize = 0;
} else {
_STD fill(_Myfirst, _Mylast, _Val);
}

_Mylast = _Ufill(_Mylast, _Newsize - _Oldsize, _Val);
} else {
const pointer _Newlast = _Myfirst + _Newsize;
_STD fill(_Myfirst, _Newlast, _Val);
_Destroy(_Newlast, _Mylast);
_Mylast = _Newlast;
}
}
使用方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
void test1() {
vector<int> a{ 0,1,2,3,4,5 };
int b = 5;
int n = 2;
//第一个参数为元素的个数,第二个参数为值
a.assign(n, b);

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
输出:
1
a 中的元素:5 5
第 2 种方法:
1
2
3
4
void assign(_Iter _First, _Iter _Last) {
_Adl_verify_range(_First, _Last);
_Assign_range(_Get_unwrapped(_First), _Get_unwrapped(_Last), _Iter_cat_t<_Iter>{});
}
使用方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void test2() {
vector<int> a{ 0,1,2,3,4,5 };
vector<int> b{ 6,7,8,9,10 };
//第一参数为指定元素范围开头的迭代器
//第二参数为指定元素范围结束的迭代器
//前闭后开[b.begin(),b.end())
a.assign(b.begin(), b.end());

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
输出:
1
a 中的元素:6 7 8 9 10
第 3 种方法:
1
2
3
void assign(initializer_list<_Ty> _Ilist) {
_Assign_range(_Ilist.begin(), _Ilist.end(), random_access_iterator_tag{});
}
使用方法:
1
2
3
4
5
6
7
8
9
10
11
void test3() {
vector<int> a{ 0,1,2,3,4,5 };
//参数为 initializer_list
a.assign({ 6,7,8,9,10 });

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
输出:
1
a 中的元素:6 7 8 9 10

总测试程序:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <forward_list>
#include <iostream>
using namespace std;
class MYTEST {
public:
void test1() {
forward_list<int> a{ 0,1,2,3,4,5 };
int b = 5;
int n = 2;
//第一个参数为元素的个数,第二个参数为值
a.assign(n, b);

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
void test2() {
forward_list<int> a{ 0,1,2,3,4,5 };
forward_list<int> b{ 6,7,8,9,10 };
//第一参数为指定元素范围开头的迭代器
//第二参数为指定元素范围结束的迭代器
//前闭后开[b.begin(),b.end())
a.assign(b.begin(), b.end());

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
void test3() {
forward_list<int> a{ 0,1,2,3,4,5 };
//参数为 initializer_list
a.assign({ 6,7,8,9,10 });

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
};
int main() {
MYTEST a;

a.test1();
a.test2();
a.test3();

return 0;
}

想自测的话,更改容器名即可。

CATALOG
  1. 1. 序列容器中的 assign 方法
    1. 1.0.1. 示例
      1. 1.0.1.0.1. 第 1 种方法:
      2. 1.0.1.0.2. 使用方法:
      3. 1.0.1.0.3. 输出:
      4. 1.0.1.0.4. 第 2 种方法:
      5. 1.0.1.0.5. 使用方法:
      6. 1.0.1.0.6. 输出:
      7. 1.0.1.0.7. 第 3 种方法:
      8. 1.0.1.0.8. 使用方法:
      9. 1.0.1.0.9. 输出:
  2. 1.0.2. 总测试程序: