昨天給同事寫了乙個把自定義型別作為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...