std::map 自定義key型別,重寫operator<() 沒有嚴格弱序引起的“invalid comparator”
問題
現象
生產環境中偶發崩潰,除錯時彈出以下彈窗:
定位問題為 map自定義key型別重寫operator<() 沒有嚴格弱序引起。
特徵
- 編譯正常,執行時偶發(取決於key值),容易讓人以為是指標問題。
問題分析
嚴格弱序三要求
參考自: C++ 嚴格弱序
- 兩個關鍵字不能同時“嚴格弱序”於對方
- 如果a“嚴格弱序”於b,且b“嚴格弱序”於c,則a必須“嚴格弱序”於c
- 如果存在兩個關鍵字,任何一個都不“嚴格弱序”於另一個,則這兩個關鍵字是相等的。
測試demo
- 根據業務程式碼bug輸出demo如下:
#include <map> struct StKey { int account; int type; StKey(int account_, int type_): account(account_), type(type_) { } bool operator<(const StKey & right) const { #if 1 // 嚴格弱序 return account < right.account && type < right.type; #else // 非嚴格弱序,產生的原來實現 return account < right.account ? true : type < right.type ? true : false; #endif } }; int main() { std::map<StKey, std::string> partMap; partMap[StKey(0, 1)] = "connection_2"; StKey partKey(1, 0); if (partMap.count(partKey)) { partMap[partKey] = "connection_3-1"; } return 0; }
- 參考 C++ 嚴格弱序的做法,定義以下三個變數:
則嚴格弱序三要求第二條結果如下:StKey a(0, 2); StKey b(1, 0); StKey c(0, 1);
非嚴格弱序 | 嚴格弱序 | |
---|---|---|
a < b | true | false |
b < c | true | false |
a < c | false | false |
相關文章
- std::sort 錯誤"Expression : invalid operator <"Express
- TreeSet重寫Comparator排序排序
- 自定義型別型別
- 一個 key 能儲存多個 value 的 map --- 自定義的 MultiValueMap,實現 Map 介面
- JAVA Comparator 自定義排序 原始碼分析Java排序原始碼
- 沒有學不會的C++:使用者自定義的隱式型別轉換C++型別
- Angular rxjs裡自定義operator的使用AngularJS
- 後序+中序(前序+中序)重構樹,嚴格O(N)演算法演算法
- c#自定義型別的轉換方式operator,以及implicit(隱式)和explicit (顯示)宣告C#型別
- 自定義資料型別資料型別
- 型別自定義格式字串型別字串
- Prometheus Operator自定義監控項Prometheus
- rxjs Observable 自定義 Operator 的開發技巧JS
- C# 泛型集合的自定義型別排序C#泛型型別排序
- ros|自定義訊息型別ROS型別
- DM自定義資料型別資料型別
- php弱型別PHP型別
- 使用 System.Text.Json 時,如何處理 Dictionary 中 Key 為自定義型別的問題JSON型別
- Laravel重寫資源路由自定義URLLaravel路由
- NodeJS 說說“重寫” 自定義stream 的實現NodeJS
- 嚴格模式和非嚴格模式區別模式
- Android 自定義構建型別 BuildTypeAndroid型別UI
- UnrealEngine建立自定義資產型別Unreal型別
- 多型關聯自定義的型別欄位的處理多型型別
- std::packaged_task<返回型別(引數型別)>Package型別
- 自定義值型別一定不要忘了重寫Equals,否則效能和空間雙雙堪憂型別
- Java : List中 根據map的某個key去重Java
- Python 多程式的自定義共享資料型別Python資料型別
- C++中過載、重寫、重定義的區別C++
- MyBatis使用自定義TypeHandler轉換型別MyBatis型別
- 兄弟連go教程(7)自定義型別Go型別
- C語言筆記——自定義型別C語言筆記型別
- Vector中存放自定義資料型別資料型別
- C#operator關鍵字自定義運算子C#
- Prometheus Operator自定義監控物件 -- Ingress-NginxPrometheus物件Nginx
- jQueryEasyUI重寫datagrid的datetimebox編輯型別jQueryUI型別
- 淺談程式語言型別的強型別,弱型別,動態型別,靜態型別型別
- 一文說透WordPress的自定義文章型別型別