Я хочу использовать карту STL с логически постоянными ключами (и мой код с использованием карты гарантирует никогда не нарушающий порядок клавиш), но фактически реализованный как переменная. Например,Tweaking const map key
struct K { int ka, kb; };
struct my_less : std::less<K> {
bool operator()(const K& l, const K& r) const
{ return l.ka+l.kb < r.ka+r.kb; }
};
std::map<K, int, my_less> m;
// put something into m and now modify keys
K& k = *const_cast<K *>(&m.begin()->first);
k.ka++;
k.kb--; // I skip code for verifying logical key immutability for the sake of example simplification
Это работает (заказ карты не нарушен), но выглядит уродливым. Есть ли лучшие альтернативы?
Возможна дополнительная косвенность с указателем (указатель const const без создания данных const), но он несет накладные расходы (и добавляет излишнюю сложность).
Перемещение переменной ключевой части из ключа в значение не является для меня вариантом.
Да, это правильный путь, но он добавляет существенные накладные расходы, неприемлемые в моем случае. – byly
По существенным накладным расходам, вы имеете в виду, что ваше значение представляет собой сложный объект, который хранится по значению на карте, поэтому копируется при вставке? Переход к значению интеллектуального указателя уменьшил бы это, поскольку вы только удаляли бы и вставляли бы указатель и не должны дублировать свой объект значения. – benjymous
Нет, вставка/удаление дерева сама по себе не такая дешевая. Я добавил разъяснение к исходному вопросу: постоянный порядок ключей гарантируется кодом пользователя. – byly