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

看板C_and_CPP作者 (小毛哥)時間11年前 (2013/04/02 10:30), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串3/4 (看更多)
先說明以下都針對C++.

04/01 16:13,
用count是因為要盡量和其他容器保持介面一致
04/01 16:13
我已看懂了, 多謝指點

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

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

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

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

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

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

04/01 21:48,
也不用再改一次
04/01 21:48
雖可理解, 但我覺得語意還是要講清楚 string用length是std的介面設計問題, 我也沒辦法改變(攤手

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

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

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

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

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

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

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

04/01 23:41,
我習慣的怎麼比較多是用 find 來判斷 existance...
04/01 23:41
確實我也認為find != end才是慣用法, 網路上能看到的文章應該大都是用find != end檢查存在, 我想如果去Stackoverflow發問應該也會得到使用find的解答吧? 老實說我是真的沒看過用count > 0這種慣用法

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

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

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

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

04/01 23:10,
我個人是要拿出來用用find 純粹判斷元素存在與否用count
04/01 23:10
-------- 所謂的語意我嘗試翻譯成中文一下: 1. count > 0: A: 請問John在嗎? B: 您好, John的個數大於0 2. find != end: A: 請問John在嗎? B: 您好, John在 參考這邊也寫得很清楚 http://www.cplusplus.com/reference/map/map/find/ "Searches the container for an element with a key equivalent to k and returns an iterator to it if found" 對於STL容器來說使用begin, end應該是家常便飯, 沒甚麼問題的 count如同loveme大所說, 還有 > 1, > 2, > 3無限多種case, 今天出現一行程式碼 if (count > 0) { ... } 後面若接著出現 else if (count > 1) { ... } else if (count > 2) { ... } 都很合理, 但這已經完全超出"確認存在"的範疇, 所以當我看到一行 if (count > 0)的時候我還無法判斷到底是要知道個數還是其他意思, 但當我看到 if (find != end)的時候馬上就知道是"不存在"的情況. 這就是我"語意"的意思, 程式碼要能夠一眼就看出他本身的意圖才夠"清楚". 這也是為什麼書裡面會說要多使用泛型演算法 (可參考C++編程規範: 101個準則第84條) for loop很好, 可以做所有事情, 但當algorithm可以替代的時候就應該使用了. 比如說我想要找出容器內第一個小於5的數字, 我可以 for (unsigned int i = 0, j = vec.size(); i < j; ++i) { if (vec[i] < 5) return i; } 也可以 it = std::find_if(vec.begin(), vec.end(), IsSmallerThanFive); 後者的語意就比前種清楚, 因為我一眼就可以看出要找東西. 還有一些例子就先不打了, 希望大家可以了解我"語意"的意思. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.133.45.115

04/02 10:50, , 1F
c++ primer 就有提到這兩種方法。
04/02 10:50, 1F

04/02 11:37, , 2F
我覺得2的B應該翻譯成您好,John不是不在這容器的迭代子
04/02 11:37, 2F
文章代碼(AID): #1HMaAwUL (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1HMaAwUL (C_and_CPP)