作者yoco315 (眠月)
看板C_and_CPP
標題Re: [問題] map的key有辦法檢驗是否存在了嗎?
時間Tue Apr 2 11:14:42 2013
※ 引述《FukadaKyoko (小毛哥)》之銘言:
: 先說明以下都針對C++.
: 雖可理解, 但我覺得語意還是要講清楚
: string用length是std的介面設計問題, 我也沒辦法改變(攤手
幫忙補充一下,其實 std::string 也可以用 size() 啦
std::string 當初設計的的時候,有想要提供跟 container 一致的介面
但是這個嘗試有點不到位 >"<~
雖然 std::string 提供了 begin(), end() 以及 size()
但是 find() 傳回的卻是 size_type 而不是 iterator。
導致我在後續的使用上有點麻煩,最近因為這個問題真難過,嗚嗚
: 確實我也認為find != end才是慣用法,
: 網路上能看到的文章應該大都是用find != end檢查存在,
: 我想如果去Stackoverflow發問應該也會得到使用find的解答吧?
: 老實說我是真的沒看過用count > 0這種慣用法
你可以試試實際上去問,兩種答案都會看到 XD
因為 if(m.count(e)) 這個用法其實很常見,
stackoverflow 上面的每一個這個問題,兩種都會有人回答。
但 if(m.count(e)) 真的比較不直覺。
我自己的話
只有在懶的打字的時候會用 if(m.count(e))
比較勤勞的時候我就會用 if(m.find(e) == m.end())
因為大部分的人對這個 pattern 比較熟悉
可以一秒鐘就反應出他的意圖是什麼
程式碼的自我表述能力是很重要的,
好的程式碼是最好一眼看下去不用思考也不用太多背景知識就可以看懂。
(最好的程式碼是根本沒有程式碼,這樣就連看都不用看)
但進一步說,
程式碼的表述能力其實也取決於讀者的知識跟習慣。
我們覺得 std::count_if(m.begin(), m.end(), functor) 很直覺。
但是 STL 的入門者可能覺得 if(...) {...} 的形式比較直覺。
也就是說「對 std::count_if() 這種 pattern 很快速反應」的能力
其實也是要經過 STL 的訓練以後才會培養出來的。
像我覺得 boost::optional op if(op) op->data 很直覺。
不代表每個人都覺得這樣很直覺。
一些 pattern 跟 idiom 都是要經過洗禮以後才會學到。
但更進一步的說
"pattern 跟 idiom 其實都是來自於語言的不足"
如果 std::map 有提供 has(e) 那我們今天根本不用討論這個問題 XD
但如果語言沒有,使用者就必須去學習跟適應一些 pattern
如果我確信維護我程式碼的人程度都很足夠,
我就會相信他們可以看懂 if(m.count(e)) 的意圖。
那我就會很大方的使用。因為他更短,更容易看,對心智的負擔比較小。
儘管這種寫法對一般人來說比較不直覺,
但像我一樣的訓練有素的狗應該可以很直覺的看懂沒問題 XD
: it = std::find_if(vec.begin(), vec.end(), IsSmallerThanFive);
: 後者的語意就比前種清楚, 因為我一眼就可以看出要找東西.
: 還有一些例子就先不打了,
: 希望大家可以了解我"語意"的意思.
完全理解。
我好想跟你當同事。
--
To iterate is human, to recurse, divine.
遞迴只應天上有, 凡人該當用迴圈. L. Peter Deutsch
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.58.34
推 BlazarArc:推 04/02 11:22
推 FukadaKyoko:真的欸 string有size 被發現沒把文件查完就發文了XD 04/02 12:31
→ FukadaKyoko:寫法的確還是看經驗啦! 04/02 12:32
→ FukadaKyoko:推為何map沒有has XD 04/02 12:33
→ FukadaKyoko:yoco大要跟我當同事我受寵若驚啊XDD 絕對不敢 04/02 12:33
→ FukadaKyoko:至少還要再練5年才行 04/02 12:33
→ FukadaKyoko:謝謝yoco大 我再去stackoverflow逛逛~~ 04/02 12:34
推 FukadaKyoko:再補充一下 的確寫法會因為閱讀的人有所不同 04/02 12:38
→ FukadaKyoko:我自己因為不確定閱讀的人是誰 04/02 12:39
→ FukadaKyoko:所以都盡量採取比較直覺(或標準)的寫法 04/02 12:39
→ FukadaKyoko:如果能確定專案內或者client都同意某種寫法的話 04/02 12:40
→ FukadaKyoko:當然就也很好~ 04/02 12:40
推 BlazarArc:因為查在map中太常太煩了現在都怒用template IsInMap XD 04/02 12:47
推 FukadaKyoko:是自己寫的wrapper嗎?XD 04/02 13:13
推 BlazarArc:是啊,不管哪種用法到處散落乍看之下都很難懂,就包起來 04/02 13:36
推 FukadaKyoko:不錯的idea! 04/02 15:10