顺序容器操作: 删除元素
2023年12月22日 2023年12月23日
顺序容器 | 支持删除元素 |
---|---|
array | X |
vector(string) | O |
deque | O |
list | O |
forward_list | O |
会改变容器大小
容器对删除元素操作的支持
顺序容器 | 删除尾元素: pop_back | 删除首元素: pop_front | 删除指定位置/给定迭代器范围元素: erase | 删除所有元素: clear |
---|---|---|---|---|
vector(string) | O | X | O | O |
deque | O | O | O | O |
list | O | O | O | O |
forward_list | X | O; 可以通过首前迭代器完成 | forward_list的erase是定制的 | O |
示例
1c.pop_back(); 2 3c.pop_front();
1c.erase(it); 2 3c.earse(b, e);
1c.clear();
区分删除元素操作
操作 | 支持删除单个元素 | 支持删除多个元素 | 支持删除所有元素 | 默认删除首/尾元素 | 返回void | 删除指示元素 |
---|---|---|---|---|---|---|
pop_front/pop_back | O | - | - | O | O | - |
erase | O | O | - | - | X | O |
clear | - | - | O | - | O | - |
是否需要移动元素
顺序容器 | pop_back | pop_front | erase(it)/erase(b, e) | clear |
---|---|---|---|---|
vector(string) | X | - | O; 非尾删需要 | - |
deque | X | X | O; 非首/尾删需要 | - |
list | X | X | X | - |
forward_list | - | X | - | - |
pop_back/pop_front操作
删除元素(弹出即删除)
返回void
要求容器不为空
删除之前根据需求决定是否保存元素
- | |
---|---|
pop_back | 删除尾元素 |
pop_front | 删除首元素 |
1c.pop_back(); 2 3c.pop_front();
pop_front操作
1while (!ilist.empty()) 2{ 3 process(ilist.front()); 4 ilist.pop_front(); 5}
erase操作
提供重载版本
- | |
---|---|
erase(it) | 删除迭代器指向的元素; 要求it指向非空; it不能是尾后迭代器 |
earse(b, e) | 删除迭代器范围包含的元素 [b, e) |
1c.erase(it); 2 3c.earse(b, e);
删除单个元素
返回指示位置的迭代器; 如果尾元素被删除,返回新的尾后迭代器
1list<int> lst = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 2auto it = lst.begin(); 3while (it != lst.end()) 4 if (*it % 2) // 除余不尽删除 5 it = lst.erase(it); 6 else 7 ++it; 8 9// lst = {0, 2, 4, 6, 8};
删除迭代器范围指示元素
返回b指示位置的迭代器
1vector<int> vec = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 2auto it = vec.begin() + 3; 3auto it2 = vec.begin() + 6; 4 5auto it3 = vec.erase(it, it2); 6// *it3 = 6 7// vec = {0, 1, 2, 6, 7, 8, 9};
clear操作
清空容器
返回void
1slist.clear(); 2 3// <=> 4// slist.erase(slist.begin(), slist.end());