std :: map中的std :: pair作为const返回

时间:2017-07-07 10:55:08

标签: c++ c++11 stl

我的示例代码是

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?

2 个答案:

答案 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 。