2011-05-03 64 views
2

我正在使用一組來保存對象。我想更改集合中的第一個對象。這是我的嘗試:如何更改集合中的對象子成員

set<myClass>::iterator i = classlist.begin(); 
i->value = 0; 

這是錯誤我得到:

error: read-only variable is not assignable 

怎麼成爲可變只讀?如何改變?

+0

請告訴我們'classlist'是什麼。 – quamrana 2011-05-03 21:58:11

+0

classlist是一個包含myClass對象的集合。 – 2011-05-03 21:58:57

+0

犯錯,對不起,什麼是'myClass'?更具體地說,它是如何定義運算符<? – quamrana 2011-05-03 22:02:40

回答

1

集合中的事物是有效的只讀 - 您不能在原地更改集合中的成員的值。你所能做的就是刪除它,然後添加一個新的成員,使其具有所需的新值。由於std :: set的二叉樹實現,此限制是必需的。

+0

是否有任何其他容器與非只讀集相似? – 2011-05-03 21:56:20

+0

是的,同樣你不能改變地圖的鍵。 – 2011-05-03 21:57:42

+0

那麼與set相似的容器是不是隻讀的? – 2011-05-03 21:58:34

0

這下編譯VS2008:

#include <set> 

struct myClass{ 
    int value; 
    int comp; 
}; 

bool operator<(const myClass& lhs,const myClass& rhs){ 
    return lhs.comp<rhs.comp; 
} 

int main(){ 

    std::set<myClass> classlist; 
    myClass c; 
    classlist.insert(c); 

    std::set<myClass>::iterator i=classlist.begin(); 
    i->value=0; 

    return 0; 
} 

但是這隻能由巧合。 operator<比較comp成員,我們更改value成員。

+0

這不會**在GCC下編譯。 – 2011-05-03 22:34:09

1

如果你真的要修改的元素在set,元素必須是 一旦從set刪除並重新插入該set
例如:

set<myClass>::iterator i = classlist.begin(); 
myClass c = *i; 
c.value = 0; 
classlist.erase(i); 
classlist.insert(c); 

如果operator<myClass並非指的value成員, 可以使用std::map而不是set。 假設新myClass不具有value構件, 並假設value構件的類型是T, 然後std::map< newMyClass, T >將滿足目的。

+0

您無法更改地圖中的按鍵。 – 2011-05-04 08:48:08

+0

@unapersson: 感謝您的評論。但是,我看不到評論 與答案有很大關聯,對不起。 上面的答案沒有說明'map'中關鍵字的修改。 – 2011-05-04 09:59:53

0

在Microsoft Studio更新STL時,他們使所有迭代器保持不變。所以set :: iterator和set :: const_iterator是相同的。

原因是因爲在一個集合中,關鍵是數據本身,並且當你改變你的數據時,也就是這個關鍵,這是一個否定的。

在Microsoft C++團隊彙報了這一重大更改的位置: http://blogs.msdn.com/b/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx

如果你想被修改您的數據,並且不希望被刪除和插入,然後使用映射來代替。

相關問題