我正在使用一組來保存對象。我想更改集合中的第一個對象。這是我的嘗試:如何更改集合中的對象子成員
set<myClass>::iterator i = classlist.begin();
i->value = 0;
這是錯誤我得到:
error: read-only variable is not assignable
怎麼成爲可變只讀?如何改變?
我正在使用一組來保存對象。我想更改集合中的第一個對象。這是我的嘗試:如何更改集合中的對象子成員
set<myClass>::iterator i = classlist.begin();
i->value = 0;
這是錯誤我得到:
error: read-only variable is not assignable
怎麼成爲可變只讀?如何改變?
集合中的事物是有效的只讀 - 您不能在原地更改集合中的成員的值。你所能做的就是刪除它,然後添加一個新的成員,使其具有所需的新值。由於std :: set的二叉樹實現,此限制是必需的。
是否有任何其他容器與非只讀集相似? – 2011-05-03 21:56:20
是的,同樣你不能改變地圖的鍵。 – 2011-05-03 21:57:42
那麼與set相似的容器是不是隻讀的? – 2011-05-03 21:58:34
這下編譯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
成員。
這不會**在GCC下編譯。 – 2011-05-03 22:34:09
如果你真的要修改的元素在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 >
將滿足目的。
您無法更改地圖中的按鍵。 – 2011-05-04 08:48:08
@unapersson: 感謝您的評論。但是,我看不到評論 與答案有很大關聯,對不起。 上面的答案沒有說明'map'中關鍵字的修改。 – 2011-05-04 09:59:53
在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
如果你想被修改您的數據,並且不希望被刪除和插入,然後使用映射來代替。
請告訴我們'classlist'是什麼。 – quamrana 2011-05-03 21:58:11
classlist是一個包含myClass對象的集合。 – 2011-05-03 21:58:57
犯錯,對不起,什麼是'myClass'?更具體地說,它是如何定義運算符<? – quamrana 2011-05-03 22:02:40