Re: [STL ] set與map的key type使用自訂class 發生 …

看板C_and_CPP作者 (三十億人的世界)時間16年前 (2009/05/26 11:15), 編輯推噓1(103)
留言4則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《lance0705 (藍‧聲‧口‧琴)》之銘言: : 問題如下: : 今天我有一個自訂類別想把它存在set中 : 譬如:set<A> SetOfA; : 但是我又希望在裝入set之後還可以改變A的值 : 因此以SetOfA的iterator呼叫了A的non-constant member function : 在VC++編譯可過 : 但在g++或icc都不行 : 後來才發現在標準的語法中 做為key type的物件必須為constant object : 想請問除了把整個code重寫orz : 有沒有別的辦法讓他在icc或g++中編譯過(或是小幅度的修改就好) : 以上 懇請板上高手回答 Visual C++ Team Blog 昨天也有提到這個問題 請看問題三:http://0rz.tw/TNBKr 在C++98/03 中,使用者是可以任意更改元素的值,只要不要改變元素順序 但在C++0x,明確的限制了這件事 "Keys in an associative container are immutable" (N2857 23.2.4/5) and "For [set and multiset], both iterator and const_iterator are constant iterators" 他提出了四種解法 1 改用 map/multimap,分離key 和value 2 刪掉改一改再塞一個新的進去 3 改用 set/multiset<shared_ptr<T>, comparator>,多一層轉換 4 上一篇推文中提到的 mutable (作者這說很怪 weird), const_cast (作者說這很邪惡 evil) 雖然 C++0x 都快變成C++1x了,還是要尊重一下...:P -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.124.160.118 ※ 編輯: freelancer 來自: 59.124.160.118 (05/26 19:27)

05/26 23:39, , 1F
我記得 STL 的教科書就說過 set 的 iterator 必為不可變。
05/26 23:39, 1F

05/26 23:40, , 2F
而且如果修改破壞 ordered 規則的話 find 會失去正確性。
05/26 23:40, 2F

05/26 23:41, , 3F
{1,2,3} 把 2 代換成 5 變 {1,5,3} 然後 find 不到 3。
05/26 23:41, 3F

05/27 08:20, , 4F
原來如此...感謝您的解答!
05/27 08:20, 4F
文章代碼(AID): #1A6yzQd2 (C_and_CPP)
文章代碼(AID): #1A6yzQd2 (C_and_CPP)