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

看板C_and_CPP (C/C++)作者 (小毛哥)時間13年前 (2013/04/01 13:24), 編輯推噓8(8016)
留言24則, 6人參與, 最新討論串2/4 (看更多)
※ 引述《musicJD (J.D.)》之銘言: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) map 問題(Question): 請問有辦法檢驗說 此key在這個map當中已經存在了嗎? 程式碼(Code):(請善用置底文網頁, 記得排版) 我想要做到的 很像是 資料庫的東西 例如 map<string,int> List; //進場人員名單(含次序) count = 0; List["Damon"] = count; count++; List["Elena"] = count; 我是否能夠知道 List["Klaus"] 是否已經進場 (有值)

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

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

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

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

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

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

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

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

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

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

03/31 15:55,
用 vector 之類的東西的話這種 query 就真的需要掃全部了
03/31 15:55
@LPH66: 確實是我沒看清楚問題, 抱歉@@ 他的map已經可以從人名查到順序了, 所以當然是用map即可 (我本以為他的value是其他東西) @karaokstar: 一樣是我沒看清楚, 抱歉 = =" 因為看到count就直覺以為是multimap, 我沒想到map也有count. (看了一下文件發現map的count只return 0 or 1, 因為key值為unique, 既然如此不知道這個API有甚麼意義?) 因為原PO說要查找內容, 所以我自己一定是用find去做, count在語意上不是查找, 是計算個數, 所以個人認為不符合狀況. 用find的話只要 if (m_Map.find(key) != m_Map.end())就好了 倒也不需要管iterator吧~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.133.45.115

04/01 16:13, , 1F
用count是因為要盡量和其他容器保持介面一致
04/01 16:13, 1F

04/01 17:28, , 2F
不太理解介面一致的意思 應當選用適合的介面才是
04/01 17:28, 2F

04/01 21:19, , 3F
界面一致很好裡解吧,減少要記憶的東西
04/01 21:19, 3F

04/01 21:20, , 4F
同樣取size,string用length,vector用count,map用size
04/01 21:20, 4F

04/01 21:20, , 5F
不是很崩潰嗎XD
04/01 21:20, 5F

04/01 21:47, , 6F
所有關聯式容器都可以用count比起multimap用count
04/01 21:47, 6F

04/01 21:48, , 7F
map用has_key set用has_element好記很多 要抽換時
04/01 21:48, 7F

04/01 21:48, , 8F
也不用再改一次
04/01 21:48, 8F

04/01 22:19, , 9F
vector也是用size啊@@ 我比較在意語意吧
04/01 22:19, 9F

04/01 22:19, , 10F
程式應該要表達本身的意思才是最重要的
04/01 22:19, 10F

04/01 22:28, , 11F
count() 不只有測試存不存在, 還有"個數"的語意, find
04/01 22:28, 11F

04/01 22:28, , 12F
就比較單純只有存在與否的判斷了
04/01 22:28, 12F

04/01 22:34, , 13F
是低~板大 我只是就原PO希望查找的意思來做選擇
04/01 22:34, 13F

04/01 22:39, , 14F
count(key)>0 跟 find(key)!=end() 我覺得前面比較直覺
04/01 22:39, 14F

04/01 22:59, , 15F
xxx != end() 已經是慣用法了...
04/01 22:59, 15F

04/01 23:00, , 16F
前者不只是 == 0 的情況, 還有其他 1, 2, 3, 4...
04/01 23:00, 16F

04/01 23:01, , 17F
但是後者慣用法只有 care "找不找得到任何一個"這件事
04/01 23:01, 17F

04/01 23:04, , 18F
map用count來判斷元素是否存在也算是一種慣用法啊XD
04/01 23:04, 18F

04/01 23:05, , 19F
我前面的推文是回答原po為什麼map要設計count
04/01 23:05, 19F

04/01 23:05, , 20F
而不是設計has_key這種function來判斷元素是否存在
04/01 23:05, 20F

04/01 23:10, , 21F
我個人是要拿出來用用find 純粹判斷元素存在與否用count
04/01 23:10, 21F

04/01 23:30, , 22F
樓上+1
04/01 23:30, 22F

04/01 23:41, , 23F
我習慣的怎麼比較多是用 find 來判斷 existance...
04/01 23:41, 23F

04/02 10:19, , 24F
find比較直覺+1,map中很少會針對同一個key做count
04/02 10:19, 24F
文章代碼(AID): #1HMHeauo (C_and_CPP)
文章代碼(AID): #1HMHeauo (C_and_CPP)