C_and_CPP 板


LINE

※ 引述《IOP14759 (iop14759)》之銘言: 原文恕刪 C++ Community 有一個文化就是: 盡可能地使用現有工具, 如果沒現成的就自己造工具出來 注意上面這句話講的是自己造工具, 不是自己造程式. 通常在開發 C++ 程式時在做的就是把手中的工具兜成想要的樣子, STL 就是在 這文化薰陶下誕生的產物, 這個概念有點像是玩接水管的遊戲 (後 面會知道原因) 雖然原文在問能不能用迴圈做, 但我更想反問原 PO: 為什麼要用迴 圈做? 因為 C++ 很少在寫迴圈的. 這並不是什麼用遞迴取代迴圈的 論述, 而是寫迴圈這件事本身就是重工. 而且直接用迴圈實作可能 會讓你喪失分析問題的能力, 可以參考 Sean Parent 的分享: GoingNative 2013: C++ Seasoning https://channel9.msdn.com/Events/GoingNative/2013/Cpp-Seasoning 了解自己想做什麼事情, 才會知道要用什麼工具來達成目的. 原本 的問題可以拆解成幾個步驟: 1. 把整數轉換為數個 bit 2. 把這些 bit 轉換為對應的 '1' 或 '0' 字元 3. 保留特定數量的字元儲存/輸出 以上每個步驟都可以用標準函式庫現有的工具來實作, 這個在原文 下方小弟有提供簡單的範例. 主要概念是用 std::bitset 取得每個 位元, 用 std::string 儲存轉換好的字元, 再用 std::string_view 來顯示子字串: 範例 #1: https://wandbox.org/permlink/EX9D7pHtAtIjpPEU 在 C++ 裡需要注意物件的生命週期, 具有 value semantic 的型別 如 std::string 在操作時很像 primitive type, 所以很容易就會 創造許多不必要的臨時物件拖垮效能, 如此失去寫 C++ 的好處. 有 興趣探討的話可以參考 Herb SutterExceptional C++ 系列書. 範例 #1 雖然簡單; 但因為有 raw loop, 本質上還存在以下問題: 1. 轉換邏輯和迴圈步進方向綁死 2. 高度相依於來源/目的容器型別及操作 (operator[], size()) 3. 需要儲存中間的結果, 最後卻不會再用到 為了移除相依性, 我們需要導入迭代器 (iterator) 的觀念, 多了 這個抽象層, 我們可以用以下敘述來印出 std::bitset 的每個位元: std::bitset<4> bits(10); // print "0101" std::copy(begin(bits), end(bits), std::ostream_iterator<bool>(std::cout, "")); 不過很可惜 std::bitset 並沒有提供迭代器介面, 如果要沿用的話 我們必須手刻一個 adaptor 出來, 長相會是下面的樣子: Iterator adaptor for random access range which has not provided iterator interfaces (C++17) https://bit.ly/2UDfKfN 我們需要偏特化 std::iterator_traits 才能和 STL Algorithm 無 縫套接, 而且因為要反向尋訪位元, 這個迭代器必須符合 LegacyBidirectionalIterator 概念 (concept). 做轉換的工作可 以附加在迭代器之上完成, 因為 Boost 裡已經有現成的直接套用即 可. 新的範例如下: 範例 #2: https://wandbox.org/permlink/LxQvdJOm12U9e44l 不同於範例 #1, 104 ~ 107 行等同於接水管的動作, 得利於模板 ( template) 的特性, 我們在設計水管的時候只需要盡可能地減少對 型別的依賴 (constraint), 就可以最大化復用性. 這個概念將在 C++20 後 Ranges library 趨於完整而逐步出現在其他函式庫實作 裡, 有興趣的話可以參考 Eric Niebler 的分享: CppCon 2015: Ranges for the Standard Library https://www.youtube.com/watch?v=mFUXNMfaciE
到這篇文的最後, 因為原 PO 的需求是要用 AnsiString 顯示部分 位元, 可以想想如何使用上面提到的工具兜出需要的功能? 另外, 如果問題改成: 將二進位表示法字串轉成整數. 你的程式碼又需要 做什麼修改呢? -- P1389R0: Guidelines for Teaching C++ to Beginners https://bit.ly/2GvDWKb SG20 Education and Recommended Videos for Teaching C++ https://www.cjdb.com.au/sg20-and-videos --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.193.76.216 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1585904477.A.3C5.html ※ 編輯: poyenc (123.193.76.216 臺灣), 04/03/2020 20:12:09
1F:推 s4300026: 讚 04/05 11:08
2F:推 sarafciel: 推 04/06 00:55
3F:→ flysonics: 推 04/06 18:58







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP