[英]The std::pair in the std::map is returned as const
我的示例代碼是
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?
所有std::set
元素都以const
方式公開。 那是因為它們既是鍵又是值,並且如果您可以隨意修改鍵,那么您將破壞集合中的樹結構。
當前無法直接修改set元素 。 您將必須先刪除然后重新插入。
(這與封裝映射無關。)
基本上, rbegin()
返回一個反向迭代器 ,該迭代器指向A
類型的對象,該對象以const方式存儲在std::set
中。
這種行為背后的原因很簡單:必須保護std::set
免受存儲在其中的元素的意外更改。
您應該記住, std::set
將其元素存儲在樹狀數據結構中,以確保快速搜索/插入/刪除操作。 std::set
內部元素的可能更改可能導致錯誤的元素比較和數據結構損壞,這就是為什么所有迭代器均通過begin()
/ end()
方法返回並且其類似物以const方式公開元素的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.