日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++sort如何使用lambda表达式对一维vector和二维vector进行排序

發布時間:2025/4/5 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++sort如何使用lambda表达式对一维vector和二维vector进行排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 一維vector排序
      • 二維vector排序
      • Lambda的語法
      • Capture(用以訪問外部作用域)

問題:今天刷題的時候,需要對二維vectorn×2_{n\times 2}n×2?按照第二關鍵字排序。看到別人使用lambda表達式進行排序,這里筆者記錄一下。

下面先給出使用lambda表達式排序的例子,后面給出lambda表達式語法等基礎知識。

一維vector排序

對vector< int > temp;按照從大到小排序

sort(temp.begin(),temp.end(),[](int a ,int b){return a>b;});

一維vector使用lambda表達式排序的測試程序:

#include<bits/stdc++.h> using namespace std;const int N =2; int main(){vector<vector<int>> vec;vector<int>temp;temp={1,2,4,5,3};sort(temp.begin(),temp.end(),[](int a ,int b){return a>b;});for(auto p:temp)cout<<p<<" ";cout<<endl; }

輸出結果:5 4 3 2 1

二維vector排序

默認按照第一關鍵字進行從小到大排序

sort(vec.begin(),vec.end());

對二維vector : vector< vector>> vec(每列兩個元素)按照第二關鍵字從大到小進行排序

sort(vec.begin(),vec.end(),[](vector<int>a, vector<int> b){return a[1]>b[1];});

按照第一關鍵字從大到小排序

sort(vec.begin(),vec.end(),[](vector<int>a, vector<int> b){return a[0]>b[0];});

測試代碼

#include<bits/stdc++.h> using namespace std;const int N =2;//每列2個元素 int main(){vector<vector<int>> vec;vec.push_back({3,10});vec.push_back({1,8});vec.push_back({5,3});vec.push_back({20,1});sort(vec.begin(),vec.end(),[](vector<int>a, vector<int> b){return a[1]>b[1];});//下標遍歷for(int i=0;i<vec.size();i++){for(int j=0;j<N;j++)cout<<vec[i][j]<<" ";cout<<endl;} }

輸出結果

3 10 1 8 5 3 20 1

下面是一些lambda表達式語法的補充。

C++11引入了lambda,允許inline函數的定義式被用作一個參數,或是一個local對象。

Lambda改變了C++標準庫的用法。

Lambda的語法

所謂lambda是一份功能定義式,可被定義于語句(statement)或表達式(expression)內部。因此你可以拿lambda當作inline函數使用。

最小型的lambda函數沒有參數,什么也不做,如下:

[]{std::cout<< "hello lambda" <<std::endl; }

可以直接調用它:

[]{std::cout<<"hello lambda" <<std::endl; }(); //prints "hello lambda"

或者把它傳遞給對象,使之能被調用:

auto l=[]{std::cout<<"hello lambda"<<std::endl;};l(); //prints “hello lambda”

如你所見,lambda總是由一個所謂的lambda introducer引入:那是一組方括號,你可以在其內指明一個所謂的capture,用來在lambda內部訪問”nonstatic外部對象“。如果無需訪問外部數據,這組方括號可以為空。Static對象,諸如cout,是可被使用的。

在lambda introducer 和lambda body之間,你可以指明參數或mutable,或一份異常明細(exception specification)或attribute specifier以及返回類型。所有這一切都可有可無,但如果其中一個出現了,參數所需的小括號就必須出現。 因此lambda語法也可以是:
[…] {…}


[…] (…)

Lambda 可以擁有參數,指明于小括號內,就像任何函數一樣:

auto l=[](const std::string& s){std::cout<<s<<std::endl; }; l("hello lambda");

然而,請注意,lambda不可以是template,你始終必須指明所有類型。

lambda也可以返回某物。但你不需要指明返回類型,該類型會根據返回值被推導出來。例如下面的lambda的返回類型是int:

[]{return 42; }

如果一定想指明一個返回類型,可使用新式C++語法

[]() -> double{return 42; }

會返回42.0
這里指明返回類型,放在實參所需要的小括號以及 字符->以后

下面是一個lambda表達式的使用用例:

auto num=[](const int & n){return n;};auto n=num(2);cout<<n<<endl;

輸出結果:2

Capture(用以訪問外部作用域)

在lambda introducer(每個lambda最開始的方括號)內,你可以指明一個capture用來處理外部作用域內未被傳遞為實參的數據:

  • [=]意味著外部作用域以by value方式傳遞給lambda。因此當這個lambda被定義時,你可以讀取所有可讀數據,但不能改動它們。
  • [&]意味著外部作用域以 by reference 方式傳遞給lambda。因此當這個lambda被定義時,你對所有數據的涂寫動作都是合法的,前提是你擁有涂寫它們的權力。

也可以個別指明lambda之內你所訪問的每一個對象是by value或 by reference。因此你可以對訪問設限,也可以混合不同的訪問權力。例如下面這些語句:

int x=0; int y=42; auto qqq=[x,&y]{cout<<"x: "<<x<<endl;cout<<"y: "<<y<<endl;++y;} x=y=77;qqq(); qqq();cout<<"final y: "<<y<<endl;

輸出結果

你也可以寫[=,&y] 取代[x,&y],意思是以by reference 方式傳遞y,其他所有實參則以by value 方式傳遞。

為了獲得passing by value 和passing by reference 混合體,你可以聲明lambda為mutable。下例中的對象都以by value 方式傳遞,但在這個lambda 所定義的函數對象內,你有權利涂寫傳入的值。

例如

int id=0; auto f=[id] () mutable{cout<<"id: "<<id<<endl;++id;}; id =42; f(); f(); f(); cout<<id<<endl;

輸出結果

可以把上述lambda的行為視同下面這個function object

class{private:int id;// copy of outside idpublic:void operator(){cout<<"id: "<<id<<endl;++id;} };

由于mutable的緣故,operator()被定義為一個non-const成員函數,那意味著對id的涂寫是可能的。 所以,有了mutable,lambda變得stateful,即使state是以 by value方式傳遞。 如果沒有指明mutable(一般往往如此),operator()就成為一個const成員函數,那么對于對象你就只能讀取,因為它們都是以值傳遞的。

總結

以上是生活随笔為你收集整理的C++sort如何使用lambda表达式对一维vector和二维vector进行排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www.狠狠撸.com | 二区三区视频 | 在线va视频 | 在线观看的黄色网址 | 久久精品—区二区三区舞蹈 | 漂亮人妻被黑人久久精品 | 日韩视频播放 | 久久国产剧情 | 蜜臀在线观看 | 欧美r级在线观看 | 国产主播一区 | 精品视频国产 | 婷婷麻豆 | 九九资源网 | 日批视频免费在线观看 | 夫妻精品| 免费观看毛片网站 | 国产精品美女 | 日p视频在线观看 | 在线不卡毛片 | 久久九九国产视频 | 日本 奴役 捆绑 受虐狂xxxx | 中文字幕av不卡 | 999成人网 | 一区二区三区免费在线观看视频 | 欧美性受xxxx黑人xyx性 | 奇米四色网| 日韩欧美视频免费观看 | 亚洲小说春色综合另类 | 日本高清视频一区二区 | 亚色中文字幕 | 欧美性猛片aaaaaaa做受 | 大尺度网站在线观看 | 国产一线二线三线在线观看 | 国产www性 | 久久久国产精品视频 | 色综合婷婷 | www.99精品| 91操碰| 美女扒开腿免费视频 | 无码人妻丰满熟妇区毛片蜜桃精品 | 草久久久久久 | 国产三区在线视频 | 中文字幕一区二区在线观看 | 亚洲一区二区三区无码久久 | 波多野结衣中文字幕久久 | 污污视频网站免费观看 | 户外少妇对白啪啪野战 | 三上悠亚在线观看一区二区 | 欧美另类色 | 国产第页 | 国产激情91 | 中国一区二区三区 | 日韩丰满少妇 | 午夜电影福利网 | 国产精品一级二级三级 | 乱短篇艳辣500篇h文最新章节 | 粉嫩av一区 | 五个女闺蜜把我玩到尿失禁 | 精品乱码一区内射人妻无码 | 国内免费精品视频 | 亚洲国产果冻传媒av在线观看 | 国产无毛片 | 欧美一区二区三区免费视频 | 色日韩 | 星空大象在线观看免费播放 | 57pao成人国产永久免费视频 | 欧美粉嫩videosex极品 | 日韩一区久久 | 免费看污片网站 | jizz日本视频| 伊人国产在线 | 福利社91 | 人人澡人人干 | 日韩女优在线 | 亚洲日本成人在线观看 | 一级草逼片 | 成人午夜免费视频 | 96在线视频 | 久久久精品小视频 | 国产婷婷一区二区三区久久 | 亚洲黄色免费电影 | 国产精品成人99一区无码 | 亚洲黄色在线看 | 久久久久久久综合色一本 | 视频福利在线观看 | 久久全国免费视频 | 国产成人一区二区三区 | 四色成人 | 国产大片一区二区三区 | 黄色片xxx| 好吊视频一区 | 性爱免费视频 | 久久人妻免费视频 | 欧美理论片在线观看 | 国产网站免费看 | 亚洲 精品 综合 精品 自拍 | 在线播放亚洲精品 | 一区二区成人在线观看 |