如何检查C+中的值+;映射而不获取“中的编译器错误”;常数;成员功能? 我有一个成员函数,它比较C++映射中的数据。我声明成员函数为常量: bool operator == (UnitSet otherSet) const;

如何检查C+中的值+;映射而不获取“中的编译器错误”;常数;成员功能? 我有一个成员函数,它比较C++映射中的数据。我声明成员函数为常量: bool operator == (UnitSet otherSet) const;,c++,stl,map,constants,C++,Stl,Map,Constants,但是,当我使用myMap[“l”]访问和比较值时,我得到了关于myMap为常量的编译器错误。在保持const指令的同时,有没有办法解决这个问题 我知道当我检查“l”键时,如果它不存在,就会为它创建一个空值,但这不会改变我的单元集的值/行为-也许我在这里太挑剔了,应该去掉“const”。这样做的好方法是什么 谢谢。std::map不幸的是,[]操作符没有常量重载。这是因为每当您访问一个不存在的密钥时,映射都会为它创建一个元素;如果映射是const,那是不可能的。因此,无法使用常量映射调用它。它与U

但是,当我使用myMap[“l”]访问和比较值时,我得到了关于myMap为常量的编译器错误。在保持const指令的同时,有没有办法解决这个问题

我知道当我检查“l”键时,如果它不存在,就会为它创建一个空值,但这不会改变我的单元集的值/行为-也许我在这里太挑剔了,应该去掉“const”。这样做的好方法是什么


谢谢。

std::map
不幸的是,
[]
操作符没有
常量
重载。这是因为每当您访问一个不存在的密钥时,映射都会为它创建一个元素;如果映射是
const
,那是不可能的。因此,无法使用常量映射调用它。它与
UnitSet
类的行为无关

您必须使用
myMap.find(TKey)
获取元素的迭代器,如果找不到它,它将返回
myMap.end()

映射迭代器指向键和值的
std::pair
,因此需要访问它的
second
成员以获取值(
first
作为键)


首先,您应该将函数签名更改为接受otherSet by const引用,因为您不需要复制它,也不会修改它:

bool operator==(const UnitSet& otherSet) const;
然后,使用
find()
begin()
而不是使用非
const
运算符[]
=end()/
++
常量迭代器
s放入
映射
s进行比较。由于
find()
begin()
const\u迭代器上的操作只需要
const
访问
map
,它们可以从
const
成员函数中使用

map<X, Y>::const_iterator i = the_map.find(key);
if (i != the_map.end())
    // here, i->first is the key, i->second is the value
else
    // key wasn't in the map after all...
map::const\u迭代器i=映射.find(键);
如果(i!=_map.end())
//这里,i->first是键,i->second是值
其他的
//钥匙毕竟不在地图上。。。

谢谢,关于引用的观点也很好,我不熟悉通过值传递的对象,比如来自obj-c背景的对象。
map<X, Y>::const_iterator i = the_map.find(key);
if (i != the_map.end())
    // here, i->first is the key, i->second is the value
else
    // key wasn't in the map after all...