lambda自调用


一.通过函数指针进行自调用

基本使用

  • 头文件: #include
  • 语法: std::function<return_type(args_type)>

代码展示

class Solution {
public:
    int numWays(int n, vector<vector<int>> &relation, int k) {
        vector<vector<int>> edges(n);
        for (auto &edge : relation) {
            int src = edge[0], dst = edge[1];
            edges[src].push_back(dst);
        }

        int ways = 0;
        function<void(int,int)> dfs = [&](int index, int steps) {
            if (steps == k) {
                if (index == n - 1) {
                    ++ways; //因为这里ways的之发生了变化,所以要用&
                }
                return;
            }
            for (int to : edges[index]) {
                dfs(to, steps + 1);
            }
        };
        dfs(0, 0);
        return ways;
    }
};

其中return_type 是函数指针的返回值类型,像上面案例中dfs函数的 void 类型。
其中args_type 是函数指针的参数类型,有多个函数参数,就可以有多个数据类型。

二、自己调用自己

这个直接上代码吧!

class Solution {
public:
    int numWays(int n, vector<vector<int>> &relation, int k) {
        vector<vector<int>> edges(n);
        for (auto &edge : relation) {
            int src = edge[0], dst = edge[1];
            edges[src].push_back(dst);
        }

        int ways = 0;
        //auto&& 和 auto&区别不太大,都可
        auto dfs = [&](auto&& dfs,int index, int steps) {   
            if (steps == k) {
                if (index == n - 1) {
                    ++ways; //因为这里ways的之发生了变化,所以要用&
                }
                return;
            }
            for (int to : edges[index]) {
                dfs(dfs,to, steps + 1);
            }
        };
        dfs(dfs,0, 0);
        return ways;
    }
};

例题请戳这

三、1组正确和错误的样例展示

错误的主要原因是lambda无法推导出其要返回的类型,所以我们可以找一种无关情况,在前面做提前申明
lambda自调用的错误情况
正确自调用版
正确自调用-function
最后用的一种,在后面用->void申明我们要返回的类型
正确自调用版-终


文章作者: 再也不会
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 再也不会 !
  目录