C++算法包 find/find_if,for_each,transform,count/count_if,merge,sort,copy,replace
记得添加算法包依赖哦~
//算法包依赖
#include <algorithm>
//set 容器依赖
#include <set>
//vector 容器依赖
#include <vector>
find和 find_if查找容器元素
find_if代码:
set<string, less<string>> set1;
set1.insert(set1.begin(), "set元素 1");
set1.insert(set1.begin(), "set元素 2");
set1.insert(set1.begin(), "set元素 3");
set1.insert(set1.begin(), "set元素 4");
set1.insert(set1.begin(), "set元素 5");
//TODO find_if 查找容器中的元素 (bind2nd为函数适配器)
cout << endl << endl << "find_if打印:" << endl;
auto it = find_if(set1.begin(), set1.end(), bind2nd(equal_to<string>(), "set元素 2"));
if (!it->empty()) {
cout << "find_if找到了" << *it << endl;
} else {
cout << "find_if未找到" << endl;
}
find_if:
- 参数一:容器开始位置
- 参数二:容器结束位置
- 参数三:bind2nd是函数适配器 equal_to<>() 是系统自带的仿函数
find_if 第三个参数bind2nd()是函数适配器,系统会将"set元素 2"
适配到equal_to
的第二个值上进行比较
系统自带的仿函数常用的有:
- equal_to<int>() 判断 x = y
- less<int>() 判断 x < y
- greater<int>() 判断 x > y
运行结果为:
find_if打印:
find_if找到了set元素 2
find 代码:
// TODO find (查找元素功能) 没有自定义仿函数
auto findp = find(set1.begin(),set1.end(),"set元素 1");
if (findp!= set1.end()) {
cout << "find找到了" << *findp << endl;
} else {
cout << "find未找到" << endl;
}
使用和 find_if 效果一样,不过 find 不需要使用仿函数,使用更加简单
for_each 用来遍历元素
set<string, less<string>> set1;
set1.insert(set1.begin(), "set元素 1");
set1.insert(set1.begin(), "set元素 2");
set1.insert(set1.begin(), "set元素 3");
set1.insert(set1.begin(), "set元素 4");
set1.insert(set1.begin(), "set元素 5");
遍历方式一:
void show_for_each(string pInt) {
cout << "for_each方式一元素为:" << pInt << endl;
}
for_each(set1.begin(), set1.end(), show_for_each);
for_each参数:
- 参数一:容器开始位置
- 参数二:容器结束位置
- 参数三: 结果返回
方式一采用了普通函数返回
运行结果为:
for_each方式一元素为:set元素 1
for_each方式一元素为:set元素 2
for_each方式一元素为:set元素 3
for_each方式一元素为:set元素 4
for_each方式一元素为:set元素 5
遍历方式二:
class ShowForEach {
public:
void operator()(string pInt) {
cout << "for_each方式二元素为:" << pInt << endl;
}
};
for_each(set1.begin(), set1.end(), ShowForEach());
方式二采用了仿函数的方式遍历所有元素
transform (修改容器内的元素)
//仿函数
class ShowTransform {
public:
int operator()(string str) {
cout << "transform修改后的元素为:" << str + "修改" << endl;
}
};
vector<string> vector1;
vector1.insert(vector1.begin(), "vector11 元素1");
vector1.insert(vector1.begin(), "vector12 元素2");
vector1.insert(vector1.begin(), "vector13 元素3");
transform(vector1.begin(), vector1.end(), vector1.begin(), ShowTransform());
transform参数:
- 参数一:容器开始位置
- 参数二:容器结束位置
- 参数三:容器被修改后要新存放的位置(可以新创建一个容器用来接收,这里我偷懒了就使用这个吧原来值覆盖掉即可)
- 参数四:自定义仿函数,用来接收返回值
运行结果:
transform修改后的元素为:vector13 元素3修改
transform修改后的元素为:vector12 元素2修改
transform修改后的元素为:vector11 元素1修改
count 和 count_if 统计容器内某一个元素的值
int number;
vector<int> vector2;
vector2.insert(vector2.begin(), 1);
vector2.insert(vector2.begin(), 2);
vector2.insert(vector2.begin(), 2);
vector2.insert(vector2.begin(), 2);
vector2.insert(vector2.begin(), 34);
vector2.insert(vector2.begin(), 34);
vector2.insert(vector2.begin(), 4);
number = count(vector2.begin(), vector2.end(), 2);
cout << "count元素个数为:" << number << endl;
number = count_if(vector2.begin(), vector2.end(), bind2nd(equal_to<int>(), 34));
cout << "countif元素个数为:" << number << endl;
count 参数:
- 参数一:容器开始位置
- 参数二:容器结束位置
- 参数三:要统计容器的值
count_if 参数:
- 参数一:容器开始位置
- 参数二:容器结束位置
- 参数三:函数适配器
这个用法和 find/find_if 用法类似,这里就不说了
运行结果为:
count元素个数为:3
countif元素个数为:2
merge 合并容器
vector<int> vector3;
vector3.insert(vector3.begin(), 41);
vector3.insert(vector3.begin(), 42);
vector<int> vector4;
vector4.insert(vector4.begin(), 43);
vector4.insert(vector4.begin(), 44);
vector4.insert(vector4.begin(), 45);
//新的容器
vector<int> vector5;
//设置新的容器大小
vector5.resize(vector3.size() + vector4.size());
/**
* 参数五:存放新的容器的首地址
*/
merge(vector3.begin(), vector3.end(), vector4.begin(), vector4.end(), vector5.begin());
for (auto it = vector5.begin(); it != vector5.end(); it++) {
cout << "merge新容器为:" << *it << endl;
}
merge 参数:
- 参数一:A 容器开始位置
- 参数二:A 容器结束位置
- 参数三:B 容器开始位置
- 参数四:B 容器结束位置
- 参数五:新容器的开始位置
运行结果为:
merge新容器为:42
merge新容器为:41
merge新容器为:45
merge新容器为:44
merge新容器为:43
sort 容器排序
vector<int> vector6;
vector6.insert(vector6.begin(), 3);
vector6.insert(vector6.begin(), 44);
vector6.insert(vector6.begin(), 424);
vector6.insert(vector6.begin(), 14);
vector6.insert(vector6.begin(), 45);
//从小到大排序
// sort(vector6.begin(),vector6.end(),less<int>());
//从大到小排序
sort(vector6.begin(), vector6.end(), greater<int>());
for (auto it = vector6.begin(); it != vector6.end(); it++) {
cout << "sort排序为:" << *it << endl;
}
sort 参数:
- 参数一:容器开始位置
- 参数二:容器结束位置
- 参数三:仿函数(这里使用系统的仿函数)
less<int>为从大到小排序 greater<int>为从小到大排序:
运行结果为:
sort排序为:424
sort排序为:45
sort排序为:44
sort排序为:14
sort排序为:3
copy 容器拷贝
vector<int> vector8;
vector8.insert(vector8.begin(), 3);
vector8.insert(vector8.begin(), 44);
vector8.insert(vector8.begin(), 424);
vector8.insert(vector8.begin(), 14);
vector8.insert(vector8.begin(), 45);
//新的容器
vector<int> vector9;
//设置容器大小
vector9.resize(vector8.size());
copy(vector8.begin(), vector8.end(), vector9.begin());
for (auto it = vector9.begin(); it != vector9.end(); it++) {
cout << "copy排序为:" << *it << endl;
}
copy 参数:
- 参数一:容器开始位置
- 参数二:容器结束位置
- 参数三:存放新容器开始位置
运行结果为:
copy排序为:45
copy排序为:14
copy排序为:424
copy排序为:44
copy排序为:3
replace 替换容器内的某一个元素
vector<int> vector10;
vector10.insert(vector10.begin(), 3);
vector10.insert(vector10.begin(), 44);
vector10.insert(vector10.begin(), 424);
vector10.insert(vector10.begin(), 14);
vector10.insert(vector10.begin(), 45);
replace(vector10.begin(), vector10.begin() + vector10.size(), 424, 111);
for (auto it = vector10.begin(); it != vector10.end(); it++) {
cout << "replace排序为:" << *it << endl;
}
replace 参数:
- 参数一:容器开始搜索位置
- 参数二:容器结束搜索位置(这里使用 begin 第 1 个搜索+ size() 表示搜索容器内所有的元素)
- 参数三:搜索的值
- 参数四:如果搜索范围内有搜索的值,则替换为该参数
运行结果:
replace排序为:45
replace排序为:14
replace排序为:111
replace排序为:44
replace排序为:3
原创不易,您的点赞就是对我最大的支持!