c++ lambda表達式在標准庫函數sort中的應用


Lambda表達式包含一個函數對象參數

標識一個 Lambda 表達式的開始,這部分必須存在,不能省略。函數對象參數是傳遞給編譯器自動生成的函數對象類的構造
函數的。函數對象參數只能使用那些到定義 Lambda 為止時 Lambda 所在作用范圍內可見的局部變量(包括 Lambda 所在類
的 this)。函數對象參數有以下形式:

    • 空。沒有任何函數對象參數。
    • =。函數體內可以使用 Lambda 所在范圍內所有可見的局部變量(包括 Lambda 所在類的 this),並且是值傳遞方式(相
      當於編譯器自動為我們按值傳遞了所有局部變量)。
    • &。函數體內可以使用 Lambda 所在范圍內所有可見的局部變量(包括 Lambda 所在類的 this),並且是引用傳遞方式
      (相當於是編譯器自動為我們按引用傳遞了所有局部變量)。
    • this。函數體內可以使用 Lambda 所在類中的成員變量。
    • a。將 a 按值進行傳遞。按值進行傳遞時,函數體內不能修改傳遞進來的 a 的拷貝,因為默認情況下函數是 const 的,要
      修改傳遞進來的拷貝,可以添加 mutable 修飾符。
    • &a。將 a 按引用進行傳遞。
    • a,&b。將 a 按值傳遞,b 按引用進行傳遞。
    • =,&a,&b。除 a 和 b 按引用進行傳遞外,其他參數都按值進行傳遞。
    • &,a,b。除 a 和 b 按值進行傳遞外,其他參數都按引用進行傳遞

sort函數中lambda表達式使用實例:

class Solution {
public:
    vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) {
        vector<vector<int>> ret;
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                ret.push_back({i, j});
            }
        }
        sort(ret.begin(), ret.end(), [=](vector<int>& a, vector<int>& b) {//因為r0,c0是當前函數的局部變量,所以只能使用值傳遞而不能使用引用傳遞造成指針混亂
            return abs(a[0] - r0) + abs(a[1] - c0) < abs(b[0] - r0) + abs(b[1] - c0);
        });
        return ret;
    }
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM