如何在STL的map中使用結構體作為鍵值

2022-08-12 02:42:22 字數 1366 閱讀 7179

這裡首先給出容器map的原型:

template <

class key,

class t,

class compare = less,

class alloc = alloc>

class map

可以看到模板引數一共有四個,第乙個就是key,即鍵;第二個就是值;第四個就是空間配置器,預設使用alloc(隨stl版本不同而不同)。那麼第三個是啥?

我們知道,map的底層資料結構,其實是樹,更確切的說,是乙個rb-tree(紅黑樹)。rb-tree樹在進行插入時,會按照一定的規則把新元素插入特定位置。相應的,進行刪除操作時,也會按一定規則修改樹的結構。此外,樹形結構也是高效率查詢的基本保證。但是,插入、刪除、查詢時都要依賴與節點之間的比較,對於map來說,我們必須提供對key進行比較的函式或操作符。這也就是第三個模板引數的意義。

預設情況下,第三個模板引數使用less型別,其中less是乙個仿函式。下面給出less的定義:

templatestruct less

: public binary_function<_ty, _ty, bool>

};

如果建立乙個less類的物件less_obj,然後使用less_obj(a,b)這樣的寫法,就相當於呼叫了less的operator()方法。而最終執行時,會自動獲取a與b的型別,並使用此型別的operator《來實現less類的operator()方法。到現在為止,就理清了map中的第三個模板引數的所有問題。

接下來的問題就是,如何在map中使用乙個結構體作為key。舉例來說,現在有乙個結構體:

typedef struct _info_headinfo_head;

如果直接使用info_head這個結構體來填入map中的第乙個模板引數的位置,並且不指定第三個模板引數的話,那麼就會使用less>作為map中對鍵值進行比較的操作符。而通過上述分析,在less中最終使用的,是info_head型別的operator《操作符。那麼顯然的,只給出上邊的簡單的對結構體的定義,是不夠的。因此,要想使用結構體來作為map中的key,那就必須為此結構體重載並實現operator《操作符。如果沒能做到這一點,就會在編譯時報錯,因為編譯器找不到對應的operator<。其中,vs2010下的編譯錯誤**是:error c2784。

修改後的結構體**如下:

typedef struct _info_head

}info_head;

不過這並不是唯一的辦法。另外一種方式,就是自己寫乙個仿函式,實現對info_head型別的比較。然後在info_head作為map中第乙個模板引數的時候,填入這個仿函式作為map的第三個模板引數。不過這樣做顯然不如上邊這種辦法簡單,這裡也不具體敘述了。

Go 22 如何在併發場景中使用Map

go語言中的map在併發情況下,唯讀是執行緒安全的,同時讀寫是執行緒不安全的。下面來看下併發情況下讀寫 map 時會出現的問題,如下 建立乙個int到int的對映 m make map int int 開啟一段併發 go func 開啟一段併發 go func 無限迴圈,讓併發程式在後台執行 for...

如何在AndroidStudio中使用AIDL

本章節介紹如何在androidstudio中使用aidl 2.在aidl下建立乙個包,包裡建立乙個 aidl檔案,右鍵aidl new aidl aidl file 紅框就是建立完成後的樣子 3.在aidl檔案寫要被呼叫的方法,此方法不能有許可權修飾符 4.首先build下,然後建立乙個servic...

STL庫之Map結構的使用

map 是stl 的乙個關聯容器,它提供一對一 其中第乙個可以稱為關鍵字,每個關鍵字只能在 map中出現一次,第二個可能稱為該關鍵字的值 的資料處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說下 map內部資料的組織,map內部自建一顆紅黑樹 一種非嚴...