F_JustWei's Studio.

序列容器中的 insert 方法

字数统计: 1.5k阅读时长: 7 min
2021/05/18 Share

序列容器中的 insert 方法

本文章基于 VS2019 创作。

insert 函数的作用:在指定迭代器之前插入新元素。

序列容器包括

  • array
  • vector
  • deque
  • list
  • forward_list

其中 array 与 forward_list 没有 insert 函数,但 forward_list 有 insert_after 函数。

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

list 示例

第 1 种方法:
1
2
3
4
5
6
iterator insert(const_iterator _Where, const _Ty& _Val) { // insert _Val at _Where
#if _ITERATOR_DEBUG_LEVEL == 2
_STL_VERIFY(_Where._Getcont() == _STD addressof(_Mypair._Myval2), "list insert iterator outside range");
#endif // _ITERATOR_DEBUG_LEVEL == 2
return _Make_iter(_Emplace(_Where._Ptr, _Val));
}
使用方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <list>
#include <iostream>
using namespace std;
int main() {
list<int> a{ 0,1,2,3,4,5 };
int b = 5;
//第一个参数为本容器的迭代器,第二个参数为值
//将值插入到第一参数之前
a.insert(a.begin(), b);

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

return 0;
}
输出:
1
a 中的元素:5 0 1 2 3 4 5
第 2 种方法:
1
2
3
4
5
6
7
8
iterator insert(const_iterator _Where, _CRT_GUARDOVERFLOW size_type _Count, const _Ty& _Val) { // insert _Count * _Val before _Where
#if _ITERATOR_DEBUG_LEVEL == 2
_STL_VERIFY(_Where._Getcont() == _STD addressof(_Mypair._Myval2), "list insert iterator outside range");
#endif // _ITERATOR_DEBUG_LEVEL == 2
_List_node_insert_op<_Alnode> _Op(_Getal());
_Op._Append_n(_Count, _Val);
return _Make_iter(_Op._Attach_before(_Mypair._Myval2, _Where._Ptr));
}
使用方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <list>
#include <iostream>
using namespace std;
int main() {
list<int> a{ 0,1,2,3,4,5 };
int b = 5;
int n = 2;
//第一个参数为本容器的迭代器,第二个参数为插入的个数,第三个参数为值
//将 n 个 b 插入到第一参数之前
a.insert(a.begin(), n, b);

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

return 0;
}
输出:
1
a 中的元素:5 5 0 1 2 3 4 5
第 3 种方法:
1
2
3
4
5
6
7
8
9
10
template <class _Iter, class = enable_if_t<_Is_iterator_v<_Iter>>>
iterator insert(const const_iterator _Where, _Iter _First, _Iter _Last) { // insert [_First, _Last) before _Where
#if _ITERATOR_DEBUG_LEVEL == 2
_STL_VERIFY(_Where._Getcont() == _STD addressof(_Mypair._Myval2), "list insert iterator outside range");
#endif // _ITERATOR_DEBUG_LEVEL == 2
_Adl_verify_range(_First, _Last);
_List_node_insert_op<_Alnode> _Op(_Getal());
_Op._Append_range_unchecked(_Get_unwrapped(_First), _Get_unwrapped(_Last));
return _Make_iter(_Op._Attach_before(_Mypair._Myval2, _Where._Ptr));
}
使用方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <list>
#include <iostream>
using namespace std;
int main() {
list<int> a{ 0,1,2,3,4,5 };
list<int> b{ 6,7,8,9,10 };
//第一个参数为本容器的迭代器,第二三参数为指定元素范围的迭代器
//将两个迭代器的之间的值(前闭后开,就是不包括b.end()指向的值)
//插入到第一参数之前
a.insert(a.end(), b.begin(), b.end());

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

return 0;
}
输出:
1
a 中的元素:0 1 2 3 4 5 6 7 8 9 10
第 4 种方法:
1
2
3
iterator insert(const_iterator _Where, _Ty&& _Val) { // insert _Val at _Where
return emplace(_Where, _STD move(_Val));
}
使用方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <list>
#include <iostream>
using namespace std;
int main() {
list<int> a{ 0,1,2,3,4,5 };
//与第 1 种方式相似,但本方法采用的是右值引用方式
a.insert(a.begin(), 5);

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

return 0;
}
输出:
1
a 中的元素:5 0 1 2 3 4 5
第 5 种方法:
1
2
3
iterator insert(const_iterator _Where, initializer_list<_Ty> _Ilist) { // insert initializer_list
return insert(_Where, _Ilist.begin(), _Ilist.end());
}
使用方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <list>
#include <iostream>
using namespace std;
int main() {
list<int> a{ 0,1,2,3,4,5 };
//第一个参数为本容器的迭代器,第二参数为 initializer_list
a.insert(a.begin(), { 6,7,8,9 });

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

return 0;
}
输出:
1
a 中的元素:0 1 2 3 4 5 6 7 8 9

forward_list 示例

forward_list 的 insert_after 函数也可以达到 vector、deque、list 的insert 函数的部分效果

因为 forward_list 的 迭代器不应该实现自减功能,所以只能插入到该迭代器的后面。

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#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;
//第一个参数为本容器的迭代器,第二个参数为值
a.insert_after(a.before_begin(), b);

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
void test2() {
forward_list<int> a{ 0,1,2,3,4,5 };
int b = 5;
int n = 2;
//第一个参数为本容器的迭代器,第二个参数为插入的个数,第三个参数为值
a.insert_after(a.before_begin(), n, b);

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
void test3() {
forward_list<int> a{ 0,1,2,3,4,5 };
forward_list<int> b{ 6,7,8,9,10 };
//第一个参数为本容器的迭代器,第二三参数为指定元素范围的迭代器
a.insert_after(a.before_begin(), b.begin(), b.end());

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
void test4() {
forward_list<int> a{ 0,1,2,3,4,5 };
//与第 1 种方式相似,但本方法采用的是右值引用方式
a.insert_after(a.before_begin(), 5);

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
void test5() {
forward_list<int> a{ 0,1,2,3,4,5 };
//第一个参数为本容器的迭代器,第二参数为 initializer_list
a.insert_after(a.before_begin(), { 6,7,8,9 });

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

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

return 0;
}
输出:
1
2
3
4
5
a 中的元素:5 0 1 2 3 4 5
a 中的元素:5 5 0 1 2 3 4 5
a 中的元素:6 7 8 9 10 0 1 2 3 4 5
a 中的元素:5 0 1 2 3 4 5
a 中的元素:6 7 8 9 0 1 2 3 4 5
CATALOG
  1. 1. 序列容器中的 insert 方法
    1. 1.0.1. list 示例
      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. 输出:
      10. 1.0.1.0.10. 第 4 种方法:
      11. 1.0.1.0.11. 使用方法:
      12. 1.0.1.0.12. 输出:
      13. 1.0.1.0.13. 第 5 种方法:
      14. 1.0.1.0.14. 使用方法:
      15. 1.0.1.0.15. 输出:
  2. 1.0.2. forward_list 示例
    1. 1.0.2.0.1. 输出: