C++ lambda递归
生活随笔
收集整理的這篇文章主要介紹了
C++ lambda递归
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
c++ lambda的匿名特性,無法直接在lambda內部遞歸調用自身。
借助std::function,這是一個可調用對象包裝器,可以容納除了類成員函數指針以外所有的可調用對象,適合作為回調函數使用。
Leetcode 47 全排列II
題目:
給定一個可包含重復數字的序列 nums ,按任意順序 返回所有不重復的全排列。
第一種寫法,直接用function包裝,lambda通過[&]捕獲引用,進而實現遞歸調用,缺點就是這種寫法一定要有個返回值類型,對于void要改成返回bool。
class Solution { public:vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int>> ans;vector<int> temp(nums.size());bitset<8> b;std::function<bool()> DFS = [&]()->bool {int index = b.count();for (size_t i = 0; i < nums.size(); i++) {if (!b[i]) {if (i && !b[i - 1] && nums[i] == nums[i - 1]) {continue;}temp[index] = nums[i];if (index + 1 == nums.size())ans.push_back(temp);else {b[i] = true;DFS();}b[i] = false;}}return false;};DFS();ans.shrink_to_fit();return ans;} };第二種,把lambda函數在外部用function包裝,在調用lambda時把新函數作為參數傳入(給冰箱起個別名“大象”,然后把“大象”裝進冰箱里)
class Solution { public:vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int>> ans;vector<int> temp(nums.size());bitset<8> b;auto dfs = [&](auto&& me)->void {int index = b.count();for (size_t i = 0; i < nums.size(); i++) {if (!b[i]) {if (i && !b[i - 1] && nums[i] == nums[i - 1]) {continue;}temp[index] = nums[i];if (index + 1 == nums.size())ans.push_back(temp);else {b[i] = true;me(me);}b[i] = false;}}};// 包裝std::function<void(decltype(dfs))> DFS = dfs;// 作為參數傳入DFS(dfs);ans.shrink_to_fit();return ans;} };總結
以上是生活随笔為你收集整理的C++ lambda递归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QQ空间图片爬虫
- 下一篇: 谷歌地图 替代_Google地图的替代品