我有一种情况,我希望有一个地图,不允许在初始化后添加/删除键,但允许更改值(因此我不能简单地使地图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>>