Я считаю, что проблема здесь в том, что ваш метод сравнения двух MY_orderID_t
не является строгим слабым порядком , типом порядка упорядочения, требуемого в C ++ STL,Чтобы быть строгим слабым порядком, ваш оператор меньше чем должен иметь следующие четыре свойства:
- Нерефлексивность : x
- Антисимметрия : Если x
- Транзитивность : Если x
- Транзитивность эквивалентности : Если x и y несопоставимы, а y и z несопоставимы, то x и z несопоставимы.
Прямо сейчас, вашпорядок не подчиняется свойствам (2) или (3).
* Во-первых, (2) нарушается следующим образом:
(0, 4) < (2, 2)
(2, 2) < (0, 4)
* Во-вторых, (3) нарушается, потому что
(0, 1) < (2, 0) < (-1, 1)
// but
(0, 1) < (-1, 1) // Fail
Чтобы это исправить,вместо того, чтобы использовать сравнение, которое у вас есть в настоящее время, используйте лексикографическое сравнение , подобное этому:
return std::lexicographical_compare(k1.orderID.begin(), k1.orderID.end(),
k2.orderID.begin(), k2.orderID.end());
Это сравнение является строгим слабым порядком и используетсяпо умолчанию все контейнеры STL.Переход к этому сравнению подчиняется свойствам (1) - (4) и должен заставить все работать правильно.
Надеюсь, это поможет!