调整const映射键

时间:2013-12-16 09:49:53

标签: c++

我想使用逻辑上不变的键的STL映射(我的代码使用map确保从不违反键排序)但实际上是作为变量实现的。例如,

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)是可能的,但它会产生开销(并增加不必要的复杂性)。

将变量键部分从键移动到值不是我的选择。

2 个答案:

答案 0 :(得分:1)

有一个很好的理由说明你不能整齐地编辑地图的键 - 你真的不应该这样做!在您的情况下,它似乎不会破坏地图排序,但这不保证! (想想如果修改两个键以获得相同的ka和kb值会发生什么?)

执行此操作的正确方法是从地图中删除元素,然后使用新密钥重新插入元素。

std::map<K, int, my_less> m;

// Push our starting object into the map
K key;
key.ka = 42;
key.kb = 123;

m[key] = 1234;

// Get the first element
auto iter = m.begin();

// make a new key
K key2;
key2 = iter->first;
key2.ka++;
key2.kb--;

int value = iter->second;

// remove old value
m.erase(iter);

// insert new value
m[key2] = value;

答案 1 :(得分:0)

对于这种情况,

boost :: multi_index是一个合理的选择。它支持更改保留顺序,而不需要太多开销。

相关问题