2011-12-25 98 views
12

我有問題,當我想通過使用迭代器更改集的元素。 這個簡單的代碼可以解釋我想要做什麼。通過迭代器更改元素

set<int> s; 
    s.insert(12); 

    set<int>::iterator it = s.begin(); 
    *it = 4; // error C3892: 'it' : you cannot assign to a variable that is const 

爲什麼我不能改變指向的值正常的迭代器,而不是常量性?

在我的代碼迭代器是由set :: find()返回。也許是更好的方法從集合中挑選特定的元素並改變他。

回答

12

一個集合是一個有序的容器(特別是它們被實現爲平衡二叉搜索樹)。如果你能夠通過迭代器改變元素的值,那麼順序不變將被打破。根據你試圖達到的目標,你可能更適合使用不同的容器或獲取值,移除元素並在設置中插入一個新元素。

+3

+1:雖然這留下了一個問題:爲什麼'begin'返回一個非''contst'迭代器? – 2011-12-25 01:17:04

+0

返回一個正常的迭代器是令人困惑的,但現在至少可以理解爲什麼我會得到這個錯誤。非常感謝。 – Scypi 2011-12-25 01:28:55

+0

@OliCharlesworth,Scypi:這有點棘手,迭代器不是'const_iterator',而是一個* mutable *迭代器。它是可以被索引的Key,它是不可變的。 §23.2.4p5*「[...]關聯容器中的鍵是不可變的。」*至於爲什麼它們總是提供非const的begin()和end(而不是const_iterator),我猜測它是儘可能保持容器接口的一致性。特別是§23.2.4p6指出,在這種情況下'iterator'和'const_iterator' *類型可以是相同的,並建議總是使用'const_iterator'來避免ODR違規。 – 2011-12-25 10:15:48