我有一种情况,我希望有一个地图,不允许在初始化后添加/删除键,但允许更改值(因此我不能简单地使地图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
}
我可以为std :: map编写我自己的包装器,但我觉得它不是太常见,所以我想知道是否已经有一个现有的解决方案.
是否有一些标准习惯用于地图不允许添加/删除键,而值可能会改变?
ps:我知道单独的标题有点模糊,因为键在地图中已经是常量,但我希望很清楚我的意思是什么……
解决方法
你能创建一个包含值的包装器,它允许在const时将值变换并将其放入地图中吗?就像是:
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; }
};
那么你的地图可以是类型
const std::map<int,Mutable<int>>
Live demo.