2013-04-30 104 views
7

根據C++引用,set :: insert應該返回pair,其中迭代器指向新插入的元素或現有元素(如果存在)。從std :: set :: insert()返回迭代器是否爲const?

但我有分配給迭代器的一個問題,因爲這個簡單的例子說明:

int main() { 
    set<int> set; 
    *set.insert(5).first = 5; 
    return 0; 
} 

我試過G ++和鏘既不作品。

set.cc:7:24: error: read-only variable is not assignable 
    *set.insert(5).first = 5; 
    ~~~~~~~~~~~~~~~~~~~~^

我找不到,指示迭代器應該尊重const對象的文檔中任何事情,沒有什麼類型簽名要麼表明這一點。有人能幫我理解爲什麼這不起作用嗎?

回答

13

對於std::set,其相關的iteratorconst_iterator類型都是恆定的雙向迭代器。這是因爲訂購了std::set。如果您要通過迭代器修改集合的元素,那麼您將打破該排序。

考慮帶有訂購元素{1, 4, 8}std::set。如果您之後做了類似*set.insert(5).first = 10;(如果允許),則首先插入5以獲得{1, 4, 5, 8},然後將插入的元素設置爲10以獲得{1, 4, 10, 8}。排序不變現在已經被打破。

由於您插入5insert(5),因此沒有理由取消引用迭代器並將它分配給5

+0

Duh。我應該想到這一點。謝謝。在我的真實例子中,它不是一個整數,是一個更復雜的對象,我想改變一些狀態。 – drwowe 2013-04-30 11:54:47

4

你不能修改一個集合的成員。這是一個有序的容器。它的迭代器是不可分配的。

3

在C++ 11中,設置迭代器是指const類型(請參閱set reference)。如果你仔細想想它是有道理的,因爲一個集合存儲了它的元素排序,而只是改變某個元素很可能會違反排序約束。

相關問題