使用const键但非const值映射?

for*_*818 6 c++ dictionary const

我有一种情况,我希望有一个地图,不允许在初始化后添加/删除键,但允许更改值(因此我不能简单地制作地图const).即

/*semi-const*/ map<int,int> myMap = initMap();

myMap[1] = 2;                  // NOT OK, because potentially adds a new key
myMap.at(1) = 2;               // OK, because works only if key is present
for (auto & element : myMap) {
    element.second = 0;        // OK, values may change
}
Run Code Online (Sandbox Code Playgroud)

我可以编写自己的包装器std::map,但我觉得这是不太常见的事情,所以我想知道是否已有现有的解决方案.

是否有一些标准习惯用于地图不允许添加/删除键,而值可能会改变?

ps:我知道单独的标题有点模糊,因为键在地图中已经是常量,但我希望很清楚我的意思是什么......

Chr*_*rew 5

您能否创建一个包含允许值在何时发生变异的值的包装器const并将其放入map?就像是:

template<typename T>
class Mutable {
    mutable T value;
public:
  const Mutable& operator=(const T& v) const { value = v; return *this; }
  T& get() const { return value; }  
};
Run Code Online (Sandbox Code Playgroud)

那么你的地图可以是类型

const std::map<int, Mutable<int>>
Run Code Online (Sandbox Code Playgroud)

现场演示。

  • @Andrew Clever,尽管它是否真的满足 OP 对“初始化后不允许添加/删除密钥的映射”的要求是有争议的,因为您*可以*在初始化后添加/删除密钥。 (2认同)

小智 0

我在这里看到 2 个选项

  1. 使地图常量并在更改某些内容时使用 const_cast

    const std::map myMap;

    myMap[1] = 2; // 不行,因为 const 映射

    (const_cast&>(myMap)).at(1) = 2; // 使用 const_cast 就可以了

  2. 创建一个包装类或派生一个仅读取和更新现有值方法的自定义映射

我认为没有一种内置方法可以制作仅具有更新值的地图,以及限制和插入。