2010-08-12 150 views
4

我學習C++,不能讓我的頭圍繞這個問題:通過迭代更改類成員

我有一個簡單的A級

class A { 
private: 
    int ival; 
    float fval; 

public: 
    A(int i = 0, float f = 0.0) : ival(i), fval(f) { } 
    ~A(){ } 
    void show() const { 
     cout << ival << " : " << fval << "\n"; 
    } 
    void setVal(int i) { 
     ival = i; 
    } 

    //const getters for both ival and fval 

    //used for the default "lesser" 
    friend bool operator<(const A& val1, const A& val2) { 
     return val1.ival < val2.ival ? true : false;; 
    } 
} 

然後,我有一個普通set<A> myset這在循環中充滿了insert(A(2, 2.2));

迭代把所有的值是沒有問題的,但我想這個迭代中修改該值:

for(set<A>::iterator iter = set3.begin(); iter != set3.end(); iter++) { 
    iter->setVal(1); 
} 

我認爲這應該是可行的,像你這樣一個foreach內做到這一點在Java中循環。編譯時我得到error: passing ‘const A’ as ‘this’ argument of ‘void A::setVal(int)’ discards qualifiers

看看STL集合的來源,我看到begin()只能用作const方法,我認爲這可能是問題。在setVal()方法上使用const進行調試總是會出現相同的錯誤,因爲我想修改A的值,所以沒什麼意義。

這是錯誤的方法來改變一堆A的值與循環?

+0

+1,因爲它似乎真的你搜索的第一個自己,這始終是一件好事,當你學到新的東西。 – ereOn 2010-08-12 13:17:15

+0

請注意'val1.ival 2010-08-12 13:19:05

+0

@Pedro:謝謝,現在你說出來了,很明顯,但是我自己看不到。 – DrColossos 2010-08-12 13:23:55

回答

5

STL設置不允許您更改存儲的值。它通過迭代器(不是集合中的實際集合)返回對象的副本。

集合這樣做的原因是因爲它使用<來對集合進行排序,並且它不想在每次解引用迭代器時都重新構造整個樹,因爲它不知道迭代器,因爲它不知道如果你改變了改變順序的東西。

如果您需要更新集合<>,請刪除舊值並添加一個新值。

編輯:剛剛檢查源SGI STL和它說的:

typedef typename _Rep_type::const_iterator iterator; 

所以,一套:: iterator是隻是一組::爲const_iterator

+0

這是否意味着我只是運氣不好而試圖用一套而不用另一個容器?這將與矢量或列表或...一起工作嗎? – DrColossos 2010-08-12 13:18:58

+0

是的,這適用於'std :: vector'。 – 2010-08-12 13:19:45

+1

你的意思是一個const&,而不是一個副本。 如果它是一個副本,它不會是const – Scharron 2010-08-12 13:21:40

1

this page,似乎begin()存在以及非const方法。

也許你的設置作爲const引用傳遞給方法?

編輯

引用的頁面是錯誤的。正如Scharron所述,對於有序集裝箱,沒有非常規的begin()(或end())方法。

我會通知的網站對他們的錯誤(這是不是第一次他們做了;))

+0

不(至少我不這麼認爲)。我使用'set myset;'而不是像上面描述的那樣添加'A'。 – DrColossos 2010-08-12 13:20:21

+0

我自己知道這個網頁,偉大的資源!如果源代碼中的定義被說成是const,那麼非const'begin()'來自哪裏? – DrColossos 2010-08-12 13:21:44

+0

這是一個錯誤。 迭代器和const_iterator在有序容器上是相同的類型(因此只有一個'begin()const'和'end()const'方法) – Scharron 2010-08-12 13:23:11