泛型算法|lambda表达式 | 无关风月 我题序等你回
Cobb 614 0

知识储备

operator() 小括号运算符重载函数 有小括号运算符重载函数的对象 =》 函数对象 =》 C++11 lambda表达式 函数对象一般不会单独使用,一般都是结合算法函数一起使用的 C++库里面提供的函数对象,都包含在functional头文件当中

void sort(int arr[], int size, Comp comp)
{
   bool flag = false;
   for (int i = 0; i < size - 1; i++)
   {
       for (int j = 0; j < size - i - 1; j++)
       {
           //    comp.operator()(arr[j], arr[j + 1])
           //if (comp(arr[j], arr[j + 1]))
           //if (arr[j] > arr[j + 1])
           {
               int tmp = arr[j];
               arr[j] = arr[j + 1];
               arr[j + 1] = tmp;
               flag = true;
           }
       }

       if (!flag)
       {
           return;
       }
   }
}

() 运算符重载演示

class Sum
{
public:
    int operator()(int a, int b)
    {
        return a + b;
    }
};

int sum(int a, int b)
{
    return a + b;
}
int main()
{
    int a = 10;
    int b = 20;
    cout << sum(a, b) << endl;

    Sum sum;
    //      sum.operator()(a, b)
    cout << sum(a, b) << endl;
}

泛型算法|lambda表达式 C++中set用法详解 | set关联式容器


#include <iostream>
#include <string>    // strlen strcpy strcmp strcat  #include<string.h>
#include <functional>  // 包含了C++库提供的函数对象
#include <algorithm>   // 包含了C++库提供的算法  sort 快排
#include <memory>      // 包含了C++库所有的智能指针
#include <stdlib.h>
#include <time.h>
#include <vector>
using namespace std;  // using 这是指示符         using声明只声明一个 std::vector


int main()
{
    int arr[] = { 12,6,78,9,21,43,65,7,21 };
    int size = sizeof(arr) / sizeof(arr[0]);

    // -------------------------sort ---------------------

    // sort(arr, size); 
    // 函数对象 的替代品 =》 lambda表达式  =》 用于算法参数
    /*
    * bool operator()(int a, int b)
    * {
    *   return a > b;
    * }
    [捕获值](参数列表)->返回值
    {
        // 函数对象要实现的代码
    }
    */
    // 算法函数接收参数时,都是一个开闭区间[begin, end)
    sort(arr, arr + size);
    sort(arr, arr + size, [](int a, int b)->bool {
        return a < b;
    });

    for (int v : arr)
    {
        cout << v << " ";
    }
    cout << endl;


    // -------------------------find ---------------------
    // 传递给find的前两个参数是表示元素范围的迭代器,第三个数是一个值,
    // find将范围中的每个元素与给定的值进行比较
    // 如果有匹配元素,则返回第一个等于给定值的元素的迭代器,
    // 如果无匹配值,则返回第二个参数表示找到了结尾。

    // find没找到,会返回第二个参数   线性的搜索   O(n)
    // vector<int>::iterator it = find(a.begin(),a.end(),val);
    int *p = find(arr, arr + size, 21);
    if (p != arr + size)
    {
        cout << p - arr << endl;
    }


    /*
    int* find(int *begin, int *end, int val)
    {
        for (int *p = begin; p != end; p++)
        {
            if (*p == val)
            {
                return p;
            }
        }
        return end;
    }

    int* find_if(int *begin, int *end, Comp comp)
    {
        for (int *p = begin; p != end; p++)
        {
            if (comp(*p))
            {
                return p;
            }
        }
        return end;
    }
    */

    // -------------------------binary_search ---------------------
    // O(logn)
    bool ret = binary_search(arr, arr + size, 21);
    cout << ret << endl;


    // -------------------------find_if ---------------------
    // 小到大的序列,  找第一个比30大的元素的值
    p = find_if(arr, arr + size, [](int a)->bool {
        return a > 30;
        });
    if (p != arr + size)
    {
        cout << p - arr << endl;  // 下标 指针相减表示内存距离
    }

    // -------------------------for_each ---------------------
    // 看一下for_each算法的使用方式
    // arr arr+size
    for_each(arr, arr + size, [](int val) {
        cout << val << " ";
        });
    cout << endl;

    for_each(arr, arr + size, [](int val) {
            if ((val & 0x1) == 0)
            {
                cout << val << " ";
            }
            ///cout << (val%2==0 ? val : -1) << " ";
        });
    cout << endl;

    // -------------------------count ---------------------
    // val 出现的次数
    cout << count(arr, arr + size, 21) << endl;

    // -------------------------reverse ---------------------
    // 字符串逆序
    string str = "hello world";
    int i = 0;
    int j = str.size() - 1;

    /*while (i < j)
    {
        char tmp = str[i];
        str[i] = str[j];
        str[j] = tmp;
        i++;
        j--;
    }*/
    reverse(str.begin(), str.end());
    cout << str << endl;

    return 0;
}



评论区