如何在"const"成员函数中不出现编译器错误的情况下检查C++映射中的值?

How can I check values in a C++ map without getting compiler errors in a "const" member function?

本文关键字:错误 情况下 检查 C++ 映射 编译器 const 成员 函数      更新时间:2023-10-16

我有一个比较c++映射中的数据的成员函数。我将成员函数声明为常量:

bool operator == (UnitSet otherSet) const;

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

我知道一个空值是为"l"键创建的,如果它不存在,当我检查它,但这不会改变我的UnitSet的值/行为-也许我在这里太挑剔了,应该只是放弃"const"。做这件事的好方法是什么?

谢谢。

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

bool operator==(const UnitSet& otherSet) const;

然后,而不是使用非const operator[],使用find()begin()/!=end()/++const_iterator s放入map s中进行比较。由于find(), begin()和对const_iterator的操作只需要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...

遗憾的是,std::map没有const[]操作符的重载。这是因为每当您访问一个不存在的键时,映射就会为它创建一个元素;如果地图是const,那是不可能的。因此,没有办法用常数映射来调用它。这与您的UnitSet类的行为无关。

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

映射迭代器指向键和值的std::pair,所以你需要访问它的second成员来获得你的值(first是键)。

const UnitSet& reference = myMap.find("l")->second;
相关文章: