Нет способа обеспечить, чтобы члены класса, используемые в предикате упорядочения, не изменялись. Модификация членов, используемых в предикате упорядочения, потенциально может нарушить набор.
Простой способ заставить компилятор позволить вам использовать набор с изменяемыми элементами - пометить элементы как изменяемые:
class Foo
{
std::string myVal1;
mutable std::string myVal2;
public:
bool operator<(const Foo& rhs)const {
return myVal1 < rhs.myVal;
}
};
Затем вы должны вручную убедиться, что Foo::operator<()
никогда не использует myVal2
в сравнении. Это возможно, но это Плохая идея (тм) . Вы можете пометить этот конкретный оператор огромным комментарием, но вы не можете автоматически дублировать этот комментарий во все пользовательские функции сравнения (std::set<>
принимает это как второй параметр).
Реальный способ достичь того, чего вы хотите - это использовать std::map<>
. Поместите часть «ключ» в ключ, а часть «значение» в значение.