C++中典型算法使用

举报
无敌清风蓝 发表于 2023/11/22 20:13:42 2023/11/22
【摘要】 头文件#include<algorithm> 1.for_eachvoid myfunc(int i){ cout << i << endl;}// 在main里vector<int> myvec = {10, 20, 30, 40, 50};for_each(myvec.begin(), myvec.end(), myfunc);执行后结果是1020304050 for_eac...

头文件

#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;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。