是否可以使用 mutable 将 std::map 中的所有键减少相同的值?

Is it ok to use mutable to decrease all the keys in std::map by the same value?

提问人:dw218192 提问时间:10/14/2023 最后编辑:dw218192 更新时间:10/14/2023 访问量:122

问:

据我所知,std::map 几乎总是作为某种自平衡搜索树实现的。因此,我认为将每个键减去相同的值不应该导致未定义的行为或损坏映射?以下代码真的安全吗?

#include <map>
#include <iostream>
using namespace std;

struct Key {
    mutable int val;
    bool operator<(Key const& other) const {
        return val < other.val;
    }
};
int main() {
    map<Key,int> mp {
        {{1},2},{{3},4},{{5},6},{{7},9}
    };
    for (auto&& kvp : mp) {
        kvp.first.val -= 2;
    }
    mp.emplace(Key{2},3);
    for (auto&& kvp : mp) {
        cout << kvp.first.val << ":" << kvp.second << " ";
    }
    cout << endl;

// should print -1:2 1:4 2:3 3:6 5:9 
}

至于用例,我认为这对于实现一个事件队列可能很有用,其中每个事件都与一个计时器相关联,如果计时器达到 0,就会被触发。

C++ stdmap 标准集

评论

6赞 Passer By 10/14/2023
“不应导致未定义的行为”,这不是UB的意思。你以一种极其恶劣的方式违反了合同,再多的“技术正确”也无法拯救你。std::map
1赞 user1937198 10/14/2023
如果您的问题实际上是实现事件队列计时器,请考虑使用计时器轮作为解决此问题的替代方法。
0赞 François Andrieux 10/14/2023
eel.is/c++draft/...开始,它只要求“对于同一容器中的任意两个键 k1 和 k2,调用 comp(k1, k2) 将始终返回相同的值。但我认为必须有某种一揽子规则,即提供给标准库功能的任何对象(不是引用)都不能自发地更改值,尽管我找不到。const
1赞 HolyBlackCat 10/14/2023
对我来说看起来不错,但我不明白你为什么要使用它。只需将绝对时间存储在每个元素中即可。
0赞 dw218192 10/14/2023
@HolyBlackCat我最初觉得它可能更有效,因为我可以快速找到值为 0 的最后一个键,而无需遍历所有元素。但是,是的,我意识到这是无用的,因为我仍然必须遍历整个地图才能减少键。

答: 暂无答案