[問題] map的key有辦法檢驗是否存在了嗎?

看板C_and_CPP (C/C++)作者 (J.D.)時間13年前 (2013/03/30 22:29), 編輯推噓3(3019)
留言22則, 5人參與, 最新討論串1/4 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) C++ , linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) map 問題(Question): 請問有辦法檢驗說 此key在這個map當中已經存在了嗎? 程式碼(Code):(請善用置底文網頁, 記得排版) 我想要做到的 很像是 資料庫的東西 例如 map<string,int> List; //進場人員名單(含次序) count = 0; List["Damon"] = count; count++; List["Elena"] = count; . . . 我是否能夠知道 List["Klaus"] 是否已經進場 (有值) 還是說有更好的寫法 不要linear search.... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.237.104.13 ※ 編輯: musicJD 來自: 36.237.104.13 (03/30 22:30)

03/30 22:31, , 1F
List.count(key) 如果有return 1 沒有return 0
03/30 22:31, 1F

03/30 22:31, , 2F
喔喔喔 太感謝了
03/30 22:31, 2F

03/30 22:35, , 3F
順便問一下 map.count 或是map[]的操作時間是log(N)嗎
03/30 22:35, 3F

03/30 22:38, , 5F
是log(N) 我想是因為map實作是用紅黑樹的關係
03/30 22:38, 5F

03/30 22:39, , 6F
話說其實有 List.find(key) 找不到會回傳 List.end()
03/30 22:39, 6F

03/31 14:47, , 7F
應該要用find, count會掃過整張map
03/31 14:47, 7F

03/31 14:49, , 8F
還有如果含次序的話...不能用map啊 map的順序不是
03/31 14:49, 8F

03/31 14:49, , 9F
insert的順序
03/31 14:49, 9F

03/31 14:56, , 10F
我是想說find回傳iterator用不到就用count比較方便
03/31 14:56, 10F

03/31 14:57, , 11F
還有想請問一下為何count是掃整張map
03/31 14:57, 11F

03/31 15:54, , 12F
vector 才會找整個容器吧...map/multimap 應該還好
03/31 15:54, 12F

03/31 15:55, , 13F
>FukadaKyoko 原 PO 這個狀況用這個方式比較好
03/31 15:55, 13F

03/31 15:55, , 14F
因為他有需要從名字反找次序的需求
03/31 15:55, 14F

03/31 15:55, , 15F
用 vector 之類的東西的話這種 query 就真的需要掃全部了
03/31 15:55, 15F

03/31 15:59, , 16F
find() 時間複雜度是 log(N) 對 std::multimap 而言就
03/31 15:59, 16F

03/31 16:02, , 17F
等同於呼叫 lower_bound(), count() 也需要看容器, 對
03/31 16:02, 17F

03/31 16:03, , 18F
std::set/std::map 可以用 1 當成 true, 0 當作 false
03/31 16:03, 18F

03/31 16:04, , 19F
但是 2, 3, 4個以上同鍵值元素都存在的話, 語意就不一
03/31 16:04, 19F

03/31 16:04, , 20F
定相同了
03/31 16:04, 20F

03/31 16:06, , 21F
count() 的時間複雜度是 find() 之後再跌代到
03/31 16:06, 21F

03/31 16:07, , 22F
upper_bound() 為止, 看你想表達的意思如何去選用吧
03/31 16:07, 22F
文章代碼(AID): #1HLlRR3o (C_and_CPP)
文章代碼(AID): #1HLlRR3o (C_and_CPP)