F_JustWei's Studio.

序列容器中的 erase 方法

字数统计: 783阅读时长: 3 min
2021/05/19 Share

序列容器中的 erase 方法

本文章基于 VS2019 创作。

erase 函数的作用:移除单个元素或元素范围。

序列容器包括

  • array
  • vector
  • deque
  • list
  • forward_list

其中 array 与 forward_list 没有 erase 函数,但 forward_list 有 erase_after 函数。

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

list 示例

第 1 种方法:
1
2
3
4
5
6
7
8
iterator erase(const const_iterator _Where) noexcept /* strengthened */ {
#if _ITERATOR_DEBUG_LEVEL == 2
_STL_VERIFY(_Where._Getcont() == _STD addressof(_Mypair._Myval2), "list erase iterator outside range");
#endif // _ITERATOR_DEBUG_LEVEL == 2
const auto _Result = _Where._Ptr->_Next;
_Node::_Freenode(_Getal(), _Mypair._Myval2._Unlinknode(_Where._Ptr));
return _Make_iter(_Result);
}
使用方法:
1
2
3
4
5
6
7
8
9
10
11
void test1() {
list<int> a{ 0,1,2,3,4,5 };
//第一参数为指定元素的迭代器
a.erase(a.begin());

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
输出:
1
a 中的元素:1 2 3 4 5
第 2 种方法:
1
2
3
4
iterator erase(const const_iterator _First, const const_iterator _Last) noexcept /* strengthened */ {
_Adl_verify_range(_First, _Last);
return _Make_iter(_Unchecked_erase(_First._Ptr, _Last._Ptr));
}
使用方法:
1
2
3
4
5
6
7
8
9
10
11
12
void test2() {
list<int> a{ 0,1,2,3,4,5 };
//第一参数为指定元素范围开头的迭代器
//第二参数为指定元素范围结束的迭代器
a.erase(a.begin(), a.end());

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
输出:
1
a 中的元素:
vector、deque、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
#include <list>
#include <iostream>
using namespace std;
class MYTEST {
public:
void test1() {
list<int> a{ 0,1,2,3,4,5 };
//第一参数为指定元素的迭代器
a.erase(a.begin());

cout << "a 中的元素:";
for (auto& t : a) {
cout << t << " ";
}
cout << endl;
}
void test2() {
list<int> a{ 0,1,2,3,4,5 };
//第一参数为指定元素范围开头的迭代器
//第二参数为指定元素范围结束的迭代器
a.erase(a.begin(), a.end());

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

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

return 0;
}

forward_list 示例

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

因为 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
#include <forward_list>
#include <iostream>
using namespace std;
class MYTEST {
public:
void test1() {
forward_list<int> a{ 0,1,2,3,4,5 };
//第一参数为指定元素的迭代器
a.erase_after(a.begin());

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

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

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

return 0;
}
输出:
1
2
a 中的元素:0 2 3 4 5
a 中的元素:0
CATALOG
  1. 1. 序列容器中的 erase 方法
    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. vector、deque、list 的测试程序:
  2. 1.0.2. forward_list 示例
    1. 1.0.2.0.1. 输出: