Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调整常量映射键_C++ - Fatal编程技术网

C++ 调整常量映射键

C++ 调整常量映射键,c++,C++,我想使用STL映射和键,这些键在逻辑上是常量(我使用映射的代码确保从不违反键顺序),但实际上是作为变量实现的。比如说, 结构K{int ka,kb;}; struct my_less:std::less{ 布尔运算符()(常数K&l,常数K&r)常数 {返回l.ka+l.kbfirst); k、 ka++; k、 kb--;//为了简化示例,我跳过了验证逻辑键不变性的代码 它可以工作(地图排序没有中断),但看起来很难看。还有更好的选择吗 使用指针进行额外间接寻址(指针生成常量而不生成数据常量)

我想使用STL映射和键,这些键在逻辑上是常量(我使用映射的代码确保从不违反键顺序),但实际上是作为变量实现的。比如说,

结构K{int ka,kb;}; struct my_less:std::less{ 布尔运算符()(常数K&l,常数K&r)常数 {返回l.ka+l.kbfirst); k、 ka++; k、 kb--;//为了简化示例,我跳过了验证逻辑键不变性的代码 它可以工作(地图排序没有中断),但看起来很难看。还有更好的选择吗

使用指针进行额外间接寻址(指针生成常量而不生成数据常量)是可能的,但它会带来开销(并增加不必要的复杂性)


将可变键部分从键移到值对我来说不是一个选项。

有一个很好的理由可以解释为什么你不能整齐地编辑地图的键-你真的不应该这样做!在您的情况下,它似乎不会破坏地图顺序,但这不是保证!(想想如果修改两个键使其具有相同的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;
std::map m;
//将起始对象推入地图
K键;
key.ka=42;
key.kb=123;
m[键]=1234;
//获取第一个元素
自动iter=m.begin();
//做一把新钥匙
K键2;
键2=国际热核实验堆->第一;
key2.ka++;
key2.kb--;
int值=国际热核实验堆->秒;
//删除旧值
m、 擦除(iter);
//插入新值
m[key2]=值;

boost::multi_index是这种情况下的合理选择。它支持保留顺序的更改,没有太多开销。

是的,这是正确的方法,但它增加了大量开销,在我的情况下是不可接受的。所谓大量开销,您的值是指复杂对象,它按值存储在映射中,因此插入时会被复制?切换到智能指针值会减轻这种情况,因为您只需删除和重新插入指针,而不必重复值对象。不,树插入/删除本身并不便宜。我对原来的问题做了澄清:恒定的键顺序是由用户代码保证的。所以你的代码在一个大地图中多次修改它们的键?听起来您真的应该重新考虑如何存储/索引这些数据。(您需要决定是需要快速代码还是安全代码,或者理想情况下两者都需要)在用户代码中使用不变量并不意味着不安全代码。我只是添加了我的库层来验证这个不变量。