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:我知道单独的标题有点模糊,因为键在地图中已经是常量,但我希望很清楚我的意思是什么......
您能否创建一个包含允许值在何时发生变异的值的包装器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)
现场演示。
小智 0
我在这里看到 2 个选项
使地图常量并在更改某些内容时使用 const_cast
const std::map myMap;
myMap[1] = 2; // 不行,因为 const 映射
(const_cast&>(myMap)).at(1) = 2; // 使用 const_cast 就可以了
创建一个包装类或派生一个仅读取和更新现有值方法的自定义映射
我认为没有一种内置方法可以制作仅具有更新值的地图,以及限制和插入。