C 中自定義結構體或類作為關聯容器的鍵

2021-10-03 22:21:15 字數 1956 閱讀 1445

stl中像set和map這樣的容器是通過紅黑樹來實現的,插入到容器中的物件是順序存放的,採用這樣的方式是非常便於查詢的,查詢效率能夠達到o(log n)。所以如果有查詢資料的需求,可以採用set或者map。

但是我們自定義的結構體或者類,無法對其比較大小,在放入到容器中的時候,就無法正常編譯通過,這是set/map容器的規範決定的。要將自定義的結構體或者類存入到set/map容器,就需要定義乙個排序的規則,使其可以比較大小。最簡單的辦法就是在結構體或者類中加入乙個過載小於號的成員函式,這樣在存資料進入set/map中時,就可以根據其規則排序。

在這裡就寫了乙個簡單的例子,將自定義的乙個二維點存入set/map,並查詢其中存入的資料:

#include

#include

#include

#include

using

namespace std;

const

double epsilon =

0.000001

;// 2d point

struct vector2d

vector2d

(double dx,

double dy)

// 向量賦值

void

set(

double dx,

double dy)

// 向量相加

vector2d operator+(

const vector2d& v)

const

// 向量相減

vector2d operator-(

const vector2d& v)

const

//向量數乘

vector2d scalar

(double c)

const

// 向量點積

double

dot(

const vector2d& v)

const

//向量的模

double

mod(

)const

bool

equel

(const vector2d& v)

const

return

false;}

bool

operator==(

const vector2d& v)

const

return

false;}

bool

operator

<

(const vector2d& v)

const

return x

true

:false;}

double x, y;};

intmain()

auto iter = pointset.

find

(vector2d(27

,63))

;if(iter == pointset.

end())

else

}auto iter = pointset.

find

(vector2d(27

,63))

;if(iter == pointset.

end())

else

}}

其中的關鍵就是在點的結構體中過載了《符號的比較函式,規定首先比較y的大小,其次在比較x的大小:

bool

operator

<

(const vector2d& v)

const

return x

true

:false

;}

最終的執行結果如下:

C 結構體自定義排序

宣告 本機無c 環境,以下 均沒有編譯測試,最近golang寫的比較多,語法可能會有問題,請自行測試 sort排序函式簡單使用 include using namespace std int a 100 bool cmp1 int x,int y bool cmp2 int x,int y int ...

自定義結構或類的比較

定義普通函式 1 include 2 include 3 using namespace std 4struct act 9bool lessact const act a1,const act a2 12int main 定義成員函式 在函式內部定義 或者 再在排序時候使用less 或者great...

C 中,自定義結構體vector的排序

c 中當 vector 中的資料型別為基本型別時我們呼叫std sort函式很容易實現 vector中資料成員的公升序和降序排序,然而當vector中的資料型別為自定義結構體型別時,我們該怎樣實現公升序與降序排列呢?有兩種方法,下面的例子能很好的說明 方法1 我們直接來看 吧,比較簡單,容易理解 i...