序列容器中的 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 { #if _ITERATOR_DEBUG_LEVEL == 2 _STL_VERIFY(_Where._Getcont() == _STD addressof(_Mypair._Myval2), "list erase iterator outside range"); #endif 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; }
|
输出:
第 2 种方法:
1 2 3 4
| iterator erase(const const_iterator _First, const const_iterator _Last) noexcept { _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; }
|
输出:
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
|