作者freelancer (三十億人的世界)
看板C_and_CPP
標題Re: [STL ] set與map的key type使用自訂class 發生 …
時間Tue May 26 19:15:37 2009
※ 引述《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)
→ tinlans:我記得 STL 的教科書就說過 set 的 iterator 必為不可變。 05/26 23:39
→ tinlans:而且如果修改破壞 ordered 規則的話 find 會失去正確性。 05/26 23:40
→ tinlans:{1,2,3} 把 2 代換成 5 變 {1,5,3} 然後 find 不到 3。 05/26 23:41
推 lance0705:原來如此...感謝您的解答! 05/27 08:20