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排序排序
- 後序+中序(前序+中序)重構樹,嚴格O(N)演算法演算法
- 沒有學不會的C++:使用者自定義的隱式型別轉換C++型別
- 一個 key 能儲存多個 value 的 map --- 自定義的 MultiValueMap,實現 Map 介面
- c#自定義型別的轉換方式operator,以及implicit(隱式)和explicit (顯示)宣告C#型別
- Prometheus Operator自定義監控項Prometheus
- 型別自定義格式字串型別字串
- 自定義資料型別資料型別
- Pl/SQL 自定義型別SQL型別
- ORACLE 自定義型別[轉]Oracle型別
- Angular rxjs裡自定義operator的使用AngularJS
- 自定義超實用Redis工具類(滿足物件,list,map等型別)Redis物件型別
- JAVA Comparator 自定義排序 原始碼分析Java排序原始碼
- php弱型別PHP型別
- 嚴格模式和非嚴格模式區別模式
- DM自定義資料型別資料型別
- UnrealEngine建立自定義資產型別Unreal型別
- Linq to sql 自定義型別SQL型別
- ros|自定義訊息型別ROS型別
- rxjs Observable 自定義 Operator 的開發技巧JS
- C# 泛型集合的自定義型別排序C#泛型型別排序
- EF:自定義Oracle的對映型別Oracle型別
- Laravel重寫資源路由自定義URLLaravel路由
- 自定義HttpMessageHandler實現HTTP方法的重寫HTTP
- reperror()的格式有嚴格要求Error
- 建立自定義塊 - 型別檢查型別
- std::packaged_task<返回型別(引數型別)>Package型別
- std::map initializer list syntax ?
- NodeJS 說說“重寫” 自定義stream 的實現NodeJS
- iOS 九宮格鍵盤的UIKeyboardTypeNumbersAndPunctuation預設型別iOSUI型別
- 自定義值型別一定不要忘了重寫Equals,否則效能和空間雙雙堪憂型別
- C#operator關鍵字自定義運算子C#
- 多型關聯自定義的型別欄位的處理多型型別
- C++中過載、重寫、重定義的區別C++
- JumpList中Recent類別和自定義型別薦型別
- Android 自定義構建型別 BuildTypeAndroid型別UI