C++ set自定義排序
set簡介
set一般插入元素時,預設使用關鍵字型別的<
運算子來比較兩個關鍵字,故一般插入後為升序,但是針對自定義資料結構,如結構體,沒有<
運算子,故無法進行比較。針對自定義資料結構或者說自定義set排序規則有如下幾種方法:
方法一 過載<
在自定義結構體中過載<
則可以實現預設排序,示例程式碼如下:
#include<iostream>
#include<set>
using namespace std;
struct Students
{
string id;
int age,height;
Students(string s,int a,int h):id(s),age(a),height(h){}
Students() {}
bool operator <(const Students &s) const {
if(id!=s.id) return id<s.id;
else return age<s.age;
}
};
int main(){
set<Students> se;
se.insert(Students("zhou",12,134));
se.insert(Students("wu" ,13,42));
se.insert(Students("zheng",34,43));
se.emplace("wang",13,43);
se.emplace("zhou",23,43);
for(auto it=se.begin();it!=se.end();it++){
cout<<it->id<<" "<<it->age<<" "<<it->height<<endl;
}
return 0;
}
執行結果如下:
方法二 過載()
示例程式碼如下:
#include<iostream>
#include<set>
using namespace std;
struct Students
{
string id;
int age,height;
Students(string s,int a,int h):id(s),age(a),height(h){}
Students() {}
};
class comp{
public:
bool operator()(const Students &s1,const Students &s2){
if(s1.id!=s2.id) return s1.id<s2.id;
return s1.age<s2.age;
}
};
int main(){
set<Students,comp> se;
se.insert(Students("zhou",12,134));
se.insert(Students("wu",13,42));
se.insert(Students("zheng",34,43));
se.emplace("wang",13,43);
se.emplace("zhou",23,43);
for(auto it=se.begin();it!=se.end();it++){
cout<<it->id<<" "<<it->age<<" "<<it->height<<endl;
}
return 0;
}
方法三 參考《C++ primer(第五版)》
示例程式碼如下:
#include<iostream>
#include<set>
using namespace std;
struct Students
{
string id;
int age,height;
Students(string s,int a,int h):id(s),age(a),height(h){}
Students() {}
};
bool cmp(const Students &s1,const Students &s2){
if(s1.id!=s2.id) return s1.id<s2.id;
return s1.age<s2.age;
}
int main(){
set<Students,decltype(cmp)*> se(cmp);
se.insert(Students("zhou",12,134));
se.insert(Students("wu",13,42));
se.insert(Students("zheng",34,43));
se.emplace("wang",13,43);
se.emplace("zhou",23,43);
for(auto it=se.begin();it!=se.end();it++){
cout<<it->id<<" "<<it->age<<" "<<it->height<<endl;
}
return 0;
}
上述程式碼中,用decltype
來指出自定義操作的型別。當使用decltype
來獲得一個函式指標型別時,必須加上一個*
來指出我們要使用一個給定函式型別的指標。用cmp
來初始化se
物件,這表示當我們向se
中插入元素時,通過呼叫cmp
來為這些元素排序。可以使用cmp
代替&cmp
作為建構函式的引數,因為當我們使用一個函式的名字時,在需要的情況下會自動轉化為一個指標,使用&cmp
效果也是一樣的。
insert
和 emplace
的使用
emplace
對應insert
,emplace_back
對應於push_back
;但是insert
和push_back
是直接將物件拷貝至容器當中,而emplace
和emplace_back
是先呼叫儲存物件建構函式,在記憶體中生成物件,然後拷貝至容器中。
相關推薦
C++ set自定義排序
set簡介 set一般插入元素時,預設使用關鍵字型別的< 運算子來比較兩個關鍵字,故一般插入後為升序,但是針對自定義資料結構,如結構體,沒有< 運算子,故無法進行比較。針對自定義資料結構或
c++ set自定義比較函式
set<char*>無法像set<string>一樣進行預設的排序操作,需要自己定義比較函式進行排序,例子如下: #include <stdio.h> #include "stdafx.h" #include<iostream> #incl
c++ map自定義排序
在c++中用到map時,如果key是自定義的struct,那麼需要自己定義比較函式。因為只有基本型別有預設的比較方法。 typedef struct myKey { int nId; int nVersion; int nNote; }myKey; ///自定義ma
STL之Set自定義排序
方法一、以類為比較器 struct classCompare { bool operator()(const int& lhs, const int& rhs) { return lhs < rhs ;
c++ 自定義排序容器set
程式設計例項: #include <iostream> #include <set> #include <string> using namespace std; using std::set; struct MySetItem {
C++中關於set的自定義排序函式的書寫
大概有兩個月沒用過C++啦,手都變得很生了,在這裡,在這裡我想扯一下關於set的比較函式的定義,我想,應該有不少人對這個東西感到頭疼吧! 如果說我想在set裡面新增一個自定義的型別,比如說下面的結構體: struct Symbol { char
c/c++ 標準庫 set 自定義關鍵字類型與比較函數
尖括號 ios template end 傳遞函數 使用 out 例子 比較 標準庫 set 自定義關鍵字類型與比較函數 問題:哪些類型可以作為標準庫set的關鍵字類型呢??? 答案: 1,任意類型,但是需要額外提供能夠比較這種類型的比較函數。 2,這種類型實現了 &l
.NET/C#中對自定義物件集合進行自定義排序的方法
一個集合可否排序,要看系統知不知道排序的規則,像內建的系統型別,int ,string,short,decimal這些,系統知道怎麼排序,而如果一個集合裡面放置的是自定義型別,比如自己定義了一個Car型別,要把它排序,系統是不知道怎麼辦的。 那麼,如何告知系統排序的規則
C/C++動態自定義結構體陣列例項鍛鍊-學生成績排序
/************************************************************************/ /* 本程式是對動態記憶體、動態陣列、結構體、函式的綜合應用。 */ /***********************
c++ stl sort 自定義排序函式cmp要遵循 strict weak ordering
滿足strict weak ordering的運算子能夠表達其他所有的邏輯運算子(logical operator): <(a, b) : (a < b) <=(a, b): !(b < a) ==(a, b): !(a <
c++的sort函式用lamda表示式自定義排序
sort函式,可以自定義compare的方法或者過載>來完成自定義排序,而lamda表示式,也可以完成這個功能,測試程式碼如下:#include <iostream> #include <vector> #include <algorith
C++11 sort, vector, lambda——vector 自定義排序
前言 std::sort大法好!很多情況下,快速排序是排序的不二選擇。#include < algorithm >中的 sort( ),完美的實現了這個快速排序。 std::vector大法好!很多情況下,vector是順序容器的不二選擇。#in
在c#中 自定義屬性 有 {get; set} 和沒有{get; set} 的區別
取值 public 之前 {} 的區別 一個 自動屬性 至少 定義 屬性:public int age{get;set;} //自動屬性 public int age{} 這種編譯不通過,get和set至少有一個,分別代表,取值和賦值 變量:public i
C#之自定義特性
創建 tip comm 字段 運算符 包含 自動 名稱 程序 在前面介紹的代碼中有使用特性,這些特性都是Microsoft定義好的,作為.NET Framework類庫的一部分,許多特性都得到了C#編譯器的支持。 .NET Frmework也允許定義自己的特性。自
[c#]Dll自定義目錄
sku 百度 tar onf bind ati 文件 c# mas 做個項目用了一堆庫,放在根目錄下面亂七八糟的。昨天百度了幾下。感覺都沒說清楚。。今天找了大半天才知道原來。。。好吧我是菜鳥。因為剛剛把一個測試工程2.0轉4.0之後這個文件app.config才浮出來,只好
VS2017 Linux C++引用自定義的動態庫
++ -1 undefined mage 編譯運行 linux下 lin 套路 log 前一篇博客講了用系統庫libpthread.so的例子,只需要在項目屬性頁的[C++->命令行參數]和[鏈接器->命令行參數]中加上對應參數(比如-pthread)即可,然後
java中實現Comparable接口實現自定義排序
static -1 return rabl generated args logs ava sca 1 class Student implements Comparable{ 2 String name; 3 int gpa; 4 @Ov
織夢按權重排序和自定義排序
load ima row idt last 教程 syn 模板文件 而已 【按權重排序】 dede:list 的方法 1、找到"根目錄\include\arc.listview.class.php"文件。 2、修改代碼:在文件第727行處添加按weight排序判斷代碼(紅色
C#winform自定義控件大全
orm cloc peter win form lai obb 全部 屬性 ood 對C# WinForm開發系列收集的控件使用方面進行整理, 加入了一些文章, 不斷補充充實, 完善這方面. 基礎 - 常用控件 C# WinForm開發系列 - CheckBox/
[LeetCode] Custom Sort String 自定義排序的字符串
iou sort all out sorted abcd tput example bcd S and T are strings composed of lowercase letters. In S, no letter occurs more than once