我的示例代码是
class A
{
int a = 0;
public:
void setA(const int value)
{
a = value;
}
};
std::map<std::string, std::set<A>> Map{{"A", {}}};
Map.rbegin()->second.rbegin()->setA(2);
我收到以下错误:“成员函数'setA'不可行:'this'参数的类型为'const A',但函数未标记为const”
我的问题是为什么rbegin()会返回一个指向A的const指针?或者为什么std:pair的第二个是std :: map中的const?
答案 0 :(得分:3)
所有std::set
元素都以const
方式公开。那是因为它们既是键又是值,如果你可以不知不觉地修改键,那么你就会破坏集合中的树结构。
It is currently not possible to directly modify set elements。您必须删除然后重新插入。
(这与封装地图无关。)
答案 1 :(得分:2)
基本上,rbegin()
返回反向迭代器,它指向A
类型的对象,该对象以 const方式存储在std::set
中
这种行为背后的原因很简单:有必要保护std::set
免受存储在其中的元素的无意更改。
您应该记住,std::set
将其元素存储在树状数据结构中,以确保快速搜索/插入/删除操作。 std::set
内部元素的可能更改可能导致错误的元素比较和数据结构损坏,这就是为什么所有迭代器都通过begin()
/ end()
方法返回,并且它们的类似物暴露了 const fashion 。