六一的部落格


关关难过关关过,前路漫漫亦灿灿。



顺序容器 支持删除元素
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());

顺序容器操作: 删除元素


顺序容器 支持删除元素
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());