C++初学者指南-5.标准库(第二部分)--移除元素算法

C++初学者指南-5.标准库(第二部分)–移除元素算法


不熟悉 C++ 的标准库算法? ⇒ 简介

remove / remove_if

remove 和 remove_if 只是把剩下的元素移动到输入范围的前面,并不会调整容器的大小或>释放内存。
如果你还想修改包含的对象,比如调整大小或缩小它,那么

  • C++98–17 之后使用容器的 erase 或 resize 成员函数。
  • C++20 请改用 std::erase / std::erase_if。
    在这里插入图片描述
    cppreference
std::vector<int> v {1,2,3,5,2,2,7};
auto re = remove(begin(v), end(v), 2);
// one could re-use the remaining space...
fill(re, end(v), 0);
for (int x : v) { cout << x << ' '; }  // 1 3 5 7 0 0 0
// ... or shrink the vector
v.erase(re, end(v));
for (int x : v) { cout << x << ' '; }  // 1 3 5 7

运行示例代码
在这里插入图片描述
cppreference

在这里插入图片描述
cppreference

auto const is_even = [](int x) { return !(x & 1); };
std::vector<int> v {1,4,3,5,8,2,7};
auto re = remove_if(begin(v), end(v), is_even);
// one could re-use the remaining space...
fill(re, end(v), 0);
for (int x : v) { cout << x << ' '; }  // 1 3 5 7 0 0 0
// ... or shrink the vector
v.erase(re, end(v));
for (int x : v) { cout << x << ' '; }  // 1 3 5 7

运行示例代码
在这里插入图片描述
cppreference

remove_copy / remove_copy_if

输出目标必须能够接收与输入范围中的元素数量相同的元素。
在这里插入图片描述
cppreference

std::vector<int> in {1,0,1,2,3,5,2,2,7,8};
std::vector<int> out;
out.resize(7);
auto re = remove_copy(begin(in)+2, begin(in)+9, begin(out), 2);
// fit output vector
out.erase(re, end(out));
for (int x : out) { cout << x << ' '; }  // 1 3 5 7

运行示例代码
在这里插入图片描述
cppreference
在这里插入图片描述
cpprefence

auto const is_even = [](int x) { return !(x & 1); };
std::vector<int> in {1,0,1,4,3,5,8,2,7,8};
std::vector<int> out;
out.resize(7);
auto re = remove_copy_if(begin(in)+2, begin(in)+9, begin(out), is_even);
// fit output vector
out.erase(re, end(out));
for (int x : out) { cout << x << ' '; }  // 1 3 5 7

运行示例代码
在这里插入图片描述
cppreference

unique / unique_copy

在这里插入图片描述
cppreference
unique 只是将剩余元素移动到输入范围的前面,并不会调整容器大小或释放内存。如果你还想修改包含的对象,之后得手动进行。

std::vector<int> v {4,4,1,5,3,3,3,6,3,3,1};
auto re = unique(begin(v), end(v));
// one could re-use the remaining space...
fill(re, end(v), 0);
for (int x : v) { cout << x << ' '; }  // 4 1 5 3 6 3 1 0 0 0 0
// ... or shrink the vector
v.erase(re, end(v));
for (int x : v) { cout << x << ' '; }  // 4 1 5 3 6 3 1

运行示例代码
在这里插入图片描述
cppreference

在这里插入图片描述
cppreference

std::vector<int> in {4,4,1,5,3,3,3,6,3,3,1};
std::vector<int> out;
out.resize(in.size());
auto re = unique_copy(begin(in), end(in), begin(out));
// fit output vector
out.erase(re, end(out));
for (int x : out) { cout << x << ' '; }  // 4 1 5 3 6 3 1

运行示例代码
在这里插入图片描述
cppreference

erase / erase_if

在这里插入图片描述
cppreference

std::vector<int> v {1,2,3,5,2,2,7};
erase(v, 2);
for (int x : v) { cout << x << ' '; }  // 1 3 5 7
std::deque<int>  d {1,2,3,5,2,2,7};
erase(d, 2);
for (int x : d) { cout << x << ' '; }  // 1 3 5 7
std::list<int>   l {1,2,3,5,2,2,7};
erase(l, 2);
for (int x : l) { cout << x << ' '; }  // 1 3 5 7

运行示例代码
在这里插入图片描述
cppreference

auto const is_even = [](int x) { return !(x & 1); };
std::vector<int> v {1,4,3,5,8,2,7};
erase_if (v, is_even);
for (int x : v) { cout << x << ' '; }  // 1 3 5 7
std::deque<int> d {1,4,3,5,8,2,7};
erase_if (d, is_even);
for (int x : d) { cout << x << ' '; }  // 1 3 5 7
std::list<int> l {1,4,3,5,8,2,7};
erase_if (l, is_even);
for (int x : l) { cout << x << ' '; }  // 1 3 5 7

运行示例代码

相关内容

视频:remove_if and more by Conor Hoekstra
视频:unique & unique_copy by Conor Hoekstra
标准算法概述
C++标准库算法介绍
标准序列容器(vector、deque、list、…)
标准关联容器(map、set、…)
标准序列视图
cppreference:算法库
cppreference:容器库
视频:什么是 C++ 标准库?
视频:一小时内掌握 105 个 STL 算法 (Jonathan Boccara,2018)
C++ 之旅:容器和算法
算法概述表:
在这里插入图片描述
附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值