С вашей функцией operator>
подумайте, что произойдет, если вы сравните {1, 0, 0}
и {0, 1, 0}
. Если вы сравниваете a > b
, он возвращает true из первого сравнения. Если вы сравниваете b > a
, это возвращает true из второго сравнения. Так что это не дает рефлексивного свойства для сравнения, скремблирования карты. Чтобы карта работала правильно, вы должны определить свой оператор> так, чтобы a > b
== !(b > a)
для всех возможных неравных пар значений, которые можно сравнивать.
редактировать
Самый простой / лучший способ убедиться, что ваш оператор правильно рефлексивен, - это обеспечить для каждого теста, который может возвращать true, у вас также есть тест с тем же условием, и операнды меняются местами, которые возвращают false.
Так что, если у вас есть
if(v1.DATA[1] > v2.DATA[1]) return 1;
в вашей функции вам нужно
if(v2.DATA[1] > v1.DATA[1]) return 0;
или эквивалент где-нибудь.