C++中典型算法使用
头文件
#include<algorithm>
1.for_each
void myfunc(int i)
{
cout << i << endl;
}
// 在main里
vector<int> myvec = {10, 20, 30, 40, 50};
for_each(myvec.begin(), myvec.end(), myfunc);
执行后结果是
10
20
30
40
50
for_each第三个参数实际是一个可调用对象,这里的myfunc是一个函数,也是可调用对象的一种。
myfunc有一个形参,是int,实际上for_each算法里面就是不断迭代给进来的两个迭代器之间的元素,拿到这个元素后,以这个元素作为实参调用myfunc函数,这就是for_each工作原理
看看for_each的实现源码
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f)
{
for(; first != last; ++first)
f(*first); //所有可调用对象,只要这样写代码,就可以被调用,十分统一
return f;
}
f(*first)这是在调用一个可调用对象,可调用对象写代码时候偶尔用到。可调用对象的共同点事,可以像调用函数一样来调用,而且调用形式非常统一,用“可调用对象名(实参1,实参2,—)”就可以,所以只要是一个可调用对象(函数,重载了operator()的类,lambda表达式等)用 f(*first);就能直接调用,从而实现代码书写的统一
2.find
用于寻找某个特定值
vector<int>::iterator finditer = find(myvec.begin(), myvec.end(), 400);
if(finditer != myvec.end())
{
cout << "vec容器中不包含内容为400的元素" << endl;
}
else
{
cout << "vec容器中包含内容为400的元素" << endl;
}
有些容器有自己的同名成员函数find,用自己成员函数的就不用传前两个参数,优先使用同名的成员函数,如果没有的话,才考虑全局的算法,例如map就有自己的find
map<int, string> mymap;
mymap.insert(std::make_pair(1, "老王"));
mymap.insert(std::make_pair(2, "老李"));
auto iter = mymap.find(2); //查找key为2的元素,有类自己的成员函数,优先使用
if(iter != mymap.end())
{
//找到
printf("编号为%d,名字为%s\n", iter->first, iter->second.c_str());
}
3.find_if
vector<int> myveca = { 1, 2, 3, 4, 5 };
auto result = find_if(myveca.begin(), myveca.end(), [](int val) { //lambda表达式
if (val > 15) //也是一种可调用对象
{
return true;
}
return false;
});
if (result == myveca.end())
{
cout << "没找到" << endl;
}
else
{
cout << "找到了" << endl;
}
find_if的调用会返回一个迭代器(上面范例返回的其实是vector<int>::iterator,指向第一个满足条件的元素,如果不存在,则指向myveca.end()
这里的可调用对象是一个lambda表达式,它里面有个规则是找到第一个满足该规则的表达式
4.sort
用于排序
vector<int> v = {50, 15, 80, 30, 46};
//sort(v.begin(), v.end()); 默认按照从小到大排序15,30,46,50,80
sort(v.begin(), v.begin() + 3);//意思是跳到元素30这里,但因为前闭后开区间,所以参与排序的元素是50,15,80,结果是15,50,80 结果是15,50,80,46
如果不想用默认的从小到大,则可以用一个函数来排序,一般叫做自定义比较函数,这个函数的返回值是一个bool类型
sort(v.begin(), v.end(), myfuncsort);
//main的上面,增加myfuncsort函数实现代码
bool myfuncsort(int i, int j)
{
//return i < j; 从小到大排序
return i > j; // 从大到小排序
}
如果不用myfuncsort函数,改用另一个可调用对象来排序也行
class A
{
public:
bool operator()(int i, int j)
{
return i > j; //从大到小排序
}
}
//main
A mya;
sort(v.begin(), v.end(), mya);
书上只提供了前两个,我这自己写了个lambda也可以,之前都不会写lambda,没想到跟着书写的多了,自己也会写了,完美!开心!
vector<int> v = { 50, 15, 80, 30, 46 };
sort(v.begin(), v.end(), [](int a, int b) {
return a > b;
}
);
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << endl;
}
- 点赞
- 收藏
- 关注作者
评论(0)