std map 自定義型別作為key

2022-06-02 10:33:16 字數 2678 閱讀 3564

昨天給同事寫了乙個把自定義型別作為map中key值的示例,結果過了半個小時,同事反饋:不滿足需求。

嗯哼?作為乙個程式設計師,不滿足需求那可就是bug呀~ 不行,得盡快給處理一下。

異常示例(不滿足需求樣例)

源**如下:

1 #include 2 #include 

3 #include 4

using

namespace

std;56

struct

sncloneinfo7;

1112

struct

snclonecompare

1318

};19

20struct

sncloneinforepo

2126 sncloneinfo find(int id, std::string

type)

27];29}

3031 std::mapm_maprelations;

32};

3334

intmain()

35, sncloneinfo);

38 repo.create(sncloneinfo, sncloneinfo);

39 repo.create(sncloneinfo, sncloneinfo);

40 repo.create(sncloneinfo, sncloneinfo);

41 repo.create(sncloneinfo, sncloneinfo);

4243 cout << "

repo size :

"<< repo.m_maprelations.size() <

44for (auto&item : repo.m_maprelations)

4549 auto temp = repo.find(0, "

abc"

);50 cout << "

temp info cloneid :

"<< temp.cloneid << "

|| type :

"<< temp.type <

5152

return0;

53 }

執行結果如下圖:

正常示例(滿足需求樣例)

源**如下:

1 #include 2 #include 

3 #include 4

using

namespace

std;56

struct

sncloneinfo7;

1112

struct

snclonecompare

1318

};19

20struct

sncloneinforepo

2126 sncloneinfo find(int id, std::string

type)

27];29}

3031 std::mapm_maprelations;

32};

3334

intmain()

35, sncloneinfo);

38 repo.create(sncloneinfo, sncloneinfo);

39 repo.create(sncloneinfo, sncloneinfo);

40 repo.create(sncloneinfo, sncloneinfo);

41 repo.create(sncloneinfo, sncloneinfo);

4243 cout << "

repo size :

"<< repo.m_maprelations.size() <

44for (auto&item : repo.m_maprelations)

4549 auto temp = repo.find(0, "

abc"

);50 cout << "

temp info cloneid :

"<< temp.cloneid << "

|| type :

"<< temp.type <

5152

return0;

53 }

執行結果如下圖:

總結**很簡單,不做贅述。只講差異點:

第乙個示例,明明存進去了5個鍵值對,結果列印個數只有4個!!

經全部列印值分析,很明確錯誤原因:比較函式中當cloneid相同時,對字串型別type值作了長度比較。

第一次插入的鍵為「0, abc」,第三次插入的鍵為「0, bcd」,cloneid相同,且兩個鍵type值長度相同,map將其視作相同的鍵,然後把鍵「0,abc」的值替換為「1,abc」完畢。

經更正,詳見第二個示例效果。

以此備錄,警醒自己。

good good study, day day up.

順序 選擇 迴圈 總結

map 自定義型別作為鍵值

作為乙個計算機專業的學生,一直沒有深入的學習過map真是罪過罪過!今天終於對map的insert機制做了一點研究,弄明白了如何用自定義型別作為鍵值了。網上大多數的言論都是必須過載 操作符,但其實不止要過載 操作符,還需過載 操作符才能更好的完成工作。對於乙個自定義型別,過載 操作符一定要合適,即對於...

怎樣為std map的自定義鍵值

1 過載 運算子 也就是過載key類的小於運算子 include include using namespace std struct stsubkey 自定義key bool operator const stsubkey right const else int main 2 為map提供比較器...

自定義型別

typedef型別 typedef 已有型別 新建型別 示例 typedef double area,volume typedef int number number i1 area a enum enum 列舉型別名 enum week 預設sun 0,可以比較 如果修改必須形如enum week...