TOP
0
0
即日起~7/10,三民書局週年慶暖身活動,簽到拿好禮!
Boost程序庫完全開發指南:深入C++“准”標準庫(第5版)(簡體書)
滿額折

Boost程序庫完全開發指南:深入C++“准”標準庫(第5版)(簡體書)

商品資訊

人民幣定價:118 元
定價
:NT$ 708 元
優惠價
87616
缺貨無法訂購
相關商品
商品簡介
作者簡介
名人/編輯推薦
目次

商品簡介

Boost是一個功能強大、構造精巧、跨平臺、開源並且完全免費的C 程序庫,有著“C ‘準’標準庫”的美譽。Boost由C 標準委員會的部分成員所設立的Boost社區開發並維護,使用了許多現代C 編程技術,其內容涵蓋字符串處理、正則表達式、容器與數據結構、並發編程、函數式編程、泛型編程、設計模式實現等許多領域,極大地豐富了C 的功能和表現力,能夠使C 軟件開發更加簡捷、靈活和高效。本書基於2019年12月發布的Boost 1.72版編寫,介紹了其中所有的160余個庫,並且結合C 11/14/17標準詳細、深入地講解了其中的數十個庫,同時實現了若干頗具實用價值的工具類和函數,可以幫助讀者迅速地理解和掌握Boost的用法,並將其應用於實際的開發工作中。本書內容豐富、結構嚴謹、詳略得當、講解透徹,意在帶領讀者領略C *的前沿技術,相信它會成為每位C 程序員的必備工具書。

作者簡介

羅劍鋒(網名Chrono)在1996年就讀於東北財經大學;1997年開始接觸C/C ;1998年參加計算機軟件專業技術資格和水平考試,獲高級程序員資質;2003年畢業於北京理工大學,獲計算機專業碩士學位。主要研究方向為C/C 、設計模式、高性能網絡服務器開發,業余愛好是閱讀、旅遊、欣賞音樂和電影。

名人/編輯推薦

“寶劍鋒從磨礪出,梅花香自苦寒來。”

Boost是一個寶庫,這本經過十年五版磨礪的經典Boost書也是寶庫。

作者以其認真的寫作態度、扎實的技術功底、十余年的堅持不懈,以及之前4版數萬讀者的支持與反饋,成就了這本Boost寶庫,其中既有可以直接拿來用的代碼,也有值得借鑒的技術設計思路。

十周年紀念版,值得你珍藏!


推薦序



最近一年,我電話面試了數十位C 應聘者,慣用的暖場問題是“您在工作中使用過STL的哪些組件?用過Boost的哪些組件?”,我得到的答案大多為vector、map和shared_ptr。如果對方是在校學生,我一般會問他vector或map的內部實現、各種操作的複雜度,以及迭代器失效的可能場景。如果對方是有經驗的程序員,我會追問shared_ptr的線程安全性、循環引用的後果及如何避免、weak_ptr的作用等。如果對方回答得不錯,還可以進一步問問他如何實現線程安全的引用計數,如何定制刪除動作等。這些問題能讓我迅速判別對方的C 水平。
我之所以在面試時問到Boost,是因為其中的許多組件確實可以用於編寫可維護的產品代碼。Boost包含近百個程序庫,其中不乏具有工程實用價值的佳品。每個人的習慣與技術背景不一樣,對Boost的取舍也不一樣。就我個人的經驗而言,首先,可以使用絕對無害的庫,如noncopyable、scoped_ptr、static_assert等,學習和使用這些庫比較簡單。其次,有些功能很容易自己實現,正好Boost裡提供了現成的代碼,那就不妨一用,如date_time和circular_buffer等。然後,在新項目中,進行消息傳遞和資源管理可以考慮采用更加現代的方式,如在某些情況下用function/bind代替虛函數作為庫的回調接口、借助shared_ptr實現線程安全的物件回調等,這二者會影響整個程序的設計思路與風格,需要通盤考慮,如果能正確使用智能指針,那麼在現代C 程序裡一般不需要出現delete語句。最後,應對某些性能不佳的庫保持警惕,如lexical_cast。總之,在每個項目組成員都能理解並運用的基礎上,適當引入現成的Boost組件,可以減少重復勞動,提高生產力。
Boost是一個寶庫,其中既有可以直接拿來用的代碼,也有值得借鑒的設計思路。試舉一例:正則表達式庫regex對線程安全的處理。
早期的RegEx類不是線程安全的,它把正則表達式和匹配動作放到了一個類裡邊。由於有可變數據,所以RegEx類的物件不能跨線程使用。如今的RegEx類明確地區分了不可變(immutable)數據與可變(mutable)數據,前者可以安全地跨線程共享,後者則不行。例如,正則表達式本身(basic_regex)與一次匹配的結果(match_results)是不可變的;而匹配動作本身(match_regex)涉及狀態更新,它是可變的,於是要用可重入的函數將其封裝起來,避免這些數據泄露給別的線程。正是由於做了這樣合理的區分,所以在正常使用RegEx類時就不必加鎖。
Donald Knuth在Coders at Work一書裡表達了這樣一個觀點:如果程序員的工作就是擺弄參數去調用現成的庫,而程序員不知道這些庫是如何實現的,那麼這份職業就沒啥樂趣可言。換句話說,固然我們強調在工作中不要重新發明輪子,但是作為一個合格的程序員,應該具備自制輪子的能力,非不能也,是不為也。
C/C 語言的一大特點是其標準庫可以用語言自身實現。C標準庫的strlen、strcpy、strcmp系列函數是教學與練習的好題材,C 標準庫的complex、string、vector則是類、資源管理、模板編程的絕佳示範。在深入了解STL的實現之後,運用STL自然手到擒來,並能自動避免一些錯誤和低效的用法。
為了消除使用Boost時的疑慮,用得更順手,有時我們需要適當了解其內部實現,甚至編寫簡化版Boost以進行對比驗證。但是由於Boost代碼用到了日常應用程序開發中不常見的高級語法和技巧,並且為了跨多個平臺和編譯器大量使用了預處理宏,所以閱讀 Boost源碼並不輕鬆,需要使用者下一番功夫。如果使用者沉迷於這些有趣的底層細節而忘了原本要解決什麼問題,恐怕就舍本逐末了。
Boost中的很多庫是按泛型編程的範式來設計的,對於熟悉面向物件編程的人而言,或許面臨一個思路的轉變。例如,你需要熟悉泛型編程的那套術語,如concept、model、refinement,才容易讀懂Boost.Threads文檔中關於各種鎖的描述。我想,對於熟悉STL設計理念的人而言,這不是什麼大問題。
在某些領域,Boost不是唯一的選擇,也不一定是最好的選擇。例如,要生成公式化的源代碼,我會首選用腳本語言寫一小段代碼生成程序,而不用Boost.Preprocessor;要在C 程序中嵌入領域特定語言,我會首選Lua或其他語言解釋器,而不用Boost.Proto;要用C 程序解析上下文無關文法,我會首選用ANTLR來定義詞法與語法規則並生成解析器(parser),而不用Boost.Spirit。總之,使用Boost時心態要平和,別較勁去改造C 語言,把Boost有助於提高生產力的那部分功能充分發揮出來,讓項目從中受益才是關鍵。
要學習Boost,除了閱讀其官方網站的文檔、示例與源碼,最好能在手邊放一本比較全面的中文書,以隨時翻閱。對不諳英文的開發者而言,這更是可幸之至。您手上這本《Boost 程序庫完全開發指南》就是很好的使用指南與參考手冊,在這本書中,作者由淺入深地介紹了Boost的大部分常用內容,能讓讀者迅速了解Boost,並從中找到自己需要的部分。拿到這本書之後,我有粗有細地閱讀了一遍,總體來看,作者水平很高,也相當務實,作者對C 和Boost的理解與運用很到位,我從這本書中學到了不少新知識。為此,我樂於向希望學習Boost程序庫的開發者推薦這本靠譜的書。
須知“功不唐捐”,作為一名現代C 程序員,在Boost上投入的精力定能獲得回報。


陳碩
《代碼大全》譯者之一
中國香港




十周年紀念·特別序言



兒時的友情純真得無憂無慮,長大後的友情真摯得催人淚下,朋友間說不出謝字,我們之間只剩一顆熾熱的心。懷念那時每一場“戰役”,那屋後白雪皚皚的“堡壘”,那遊戲機前的等待。感謝那一只手套,那一個微笑,我們擁有著共同的歲月和青春,叫一聲朋友,這個年代,這份友情,沒有什麼比你更加讓我自豪。我的朋友!因為有你,童年才值得回味。就讓我們緊握友情,幸福走過……
——小學同學 岳大海


羅劍鋒是我的“發小”,那時的他是班級、學校的驕傲,是名副其實的“學霸”,現在的他則是我們這些玩伴的驕傲。他過著讓別人羨慕的人生,但我們卻知道,這是他一步一個腳印,一步一滴汗水走過來的。他所有的成就我們都有目共睹,兒時的種種經歷雖已過許久,卻記憶猶新。
他和我們一起瘋過,笑過,鬧過,奮斗過,拼搏過,那些回憶讓人更珍惜我們單純的情誼。有種惦記疏淡,卻很甘甜;有種問候平常,卻很溫暖;有種信任無言,卻最親切;有種友誼清澈,卻最長遠。
——小學同學 王峰


我跟老羅是從小認識的,他比我高很多年級,我上初中的時候他好像就參加完高考了。
那時候他一直是我們林場中“別人家的孩子”,不得不說老羅對我的影響挺大的,因為我的父母總教育我打遊戲會耽誤學習,但是我發現老羅遊戲打得好,也沒耽誤學習啊。所以我對家長的這條教育一直是不屑的。但是後來我發現我錯了,因為“既擅長打遊戲又不耽誤學習”不是適用於所有人的。
老羅打RPG/SLG遊戲是高手,他很有耐心,一個遊戲通關幾遍是常事,然後還會鼓動你多嘗試幾次,不知道是不是想讓他這個“遊戲廳老闆”多賺點錢。但是他不擅長對戰類遊戲,在這方面他常常是我的手下敗將。
老羅喜歡看書、寫書、看電影,當時我很難理解,書有什麼可看的,不如多打幾盤遊戲。問題是他看書看多了,還要寫書,這種表現太讓人“氣憤”了,有時恨得“咬牙切齒”,你說至於麼,都是打遊戲的人,何必甩我們幾條街。看電影也是,看點中國的啊,全是國外的,不知道從哪裡整得那麼多碟片,我看都看不懂,就記得有部電影裡面有個人躲子彈有點厲害。
不說了,人家現在日子過得好,說多了顯得我嫉妒他。
——小學同學 袁斌


時光荏苒,歲月如梭,想想認識羅兒(我喜歡這麼叫他)已有三十年了,歲月真是把殺豬刀啊!初一入學第一天我們相識的場景還歷歷在目,如今我的兒子都已經很大了,想想這三十年,我們是真正的好“基友”:初中、高中我們在同一個班,大學我們分開了一段時間,但大學畢業後,我們又來到同一個城市,還在同一個區。羅兒不僅是我的朋友,更是我的兄弟。
羅兒是一個很踏實的人,他做任何事情都會做到極致,我最佩服他這一點。同樣是玩遊戲,他不僅能通關還能給雜志社寫攻略賺稿費。同樣是學習,從初一開始,我們這屆就沒見過別人能考第一,無論你是從哪兒轉學過來的,無論題有多難,他一直是我們這屆學生中名副其實的“學霸”。我現在還經常用羅兒的事例教育我兒子:“你羅叔叔當年就是這麼學的!”
羅兒是一個愛好廣泛的人,喜歡邁克爾·杰克遜、鄭智化的音樂,還喜歡看《七龍珠》《幽遊白書》等漫畫。剛開始我都不知道這些是什麼,在他的帶動下開始接觸,也慢慢喜歡。我們總在一起討論漫畫情節,或者在晚自習回家的路上大聲唱歌,我對這些事物僅僅是喜歡,但羅兒把漫畫插頁畫出來還集成冊,這就厲害了!
最後說到羅兒的書,其實我一點也不懂,真的是“天書”,但是我相信我兄弟,他的書準沒錯,就像他的人一樣!
——中學同學 時吉斌


歲月在不知不覺間潺潺流淌,帶走了三十載的光陰,羅劍鋒中學時的樣子仿佛還氤氳在我的眼前。
畢業後,昔日同窗的情誼沒有因為距離增長而愈見稀薄,反而因為時間的醞釀而更加珍貴。閑暇或偶爾出差去北京時,我會與老友點我們最愛的烤鴨,共敘閑話,聊聊兒女,每每都會生出於繁忙生活中偷得閑生的輕鬆之感。
三十年後的今天,老同學說讓我幫他的書寫個序,一時感慨良多,說起來這還是我第一次為書寫序。還記得初中時羅劍鋒一直是班級第一,而我偏是那萬年第二,少年的意氣當然不允許這樣,可惜超過他始終是這些年我未竟的心願。他始終是我們中學同學的驕傲,記憶中他的眼睛總是那麼炯炯有神,好像總有用不完的精力,沒有解決不了的難題,在學習


目次

目錄

第0章 導讀 1
0.1 關於本書 1
0.2 讀者物件 2
0.3 術語與風格 2
0.4 語言標準 3
0.5 本書的結構 4
0.6 如何閱讀本書 5
0.7 本書的源碼 5
第1章 總論 7
1.1 簡介 7
1.1.1 獲取方式 8
1.1.2 目錄結構 8
1.1.3 使用方式 9
1.2 開發環境 10
1.2.1 快捷安裝 10
1.2.2 完全安裝 10
1.2.3 定制安裝 11
1.2.4 編譯驗證 11
1.3 構建工具 12
1.3.1 安裝方式 12
1.3.2 構建腳本 13
1.3.3 構建語言 13
1.3.4 構建命令 14
1.4 總結 14
第2章 時間與日期 15
2.1 timer庫概述 15
2.2 timer 16
2.2.1 用法 16
2.2.2 類摘要 17
2.2.3 使用建議 18
2.3 progress_timer 18
2.3.1 用法 18
2.3.2 類摘要 19
2.4 date_time庫概述 20
2.4.1 使用方式 20
2.4.2 基本概念 21
2.5 處理日期 21
2.5.1 日期 22
2.5.2 創建日期物件 22
2.5.3 訪問日期 24
2.5.4 日期的輸出 25
2.5.5 轉換C結構 26
2.5.6 日期長度 26
2.5.7 日期運算 27
2.5.8 日期區間 29
2.5.9 日期區間運算 30
2.5.10 日期迭代器 32
2.5.11 其他功能 33
2.5.12 綜合運用 33
2.6 處理時間 36
2.6.1 時間長度 36
2.6.2 操作時間長度 38
2.6.3 時間精確度 39
2.6.4 時間點 41
2.6.5 創建時間點物件 42
2.6.6 操作時間點物件 42
2.6.7 轉換C結構 43
2.6.8 時間區間 44
2.6.9 時間迭代器 44
2.6.10 綜合運用 45
2.7 date_time庫的高級議題 48
2.7.1 編譯配置宏 48
2.7.2 自定義字面值 48
2.7.3 格式化時間 49
2.7.4 本地時間 50
2.8 總結 51
第3章 內存管理 53
3.1 smart_ptr庫概述 53
3.1.1 RAII機制 53
3.1.2 智能指針 54
3.2 scoped_ptr 55
3.2.1 類摘要 55
3.2.2 操作函數 56
3.2.3 用法 57
3.2.4 對比標準 59
3.3 shared_ptr 61
3.3.1 類摘要 61
3.3.2 操作函數 62
3.3.3 用法 64
3.3.4 工廠函數 65
3.3.5 應用於標準容器 66
3.3.6 應用於橋接模式 67
3.3.7 應用於工廠模式 68
3.3.8 定制刪除器 70
3.3.9 高級議題 71
3.4 weak_ptr 75
3.4.1 類摘要 75
3.4.2 用法 75
3.4.3 物件自我管理 76
3.4.4 打破循環引用 77
3.5 intrusive_ptr 79
3.5.1 類摘要 79
3.5.2 用法 80
3.5.3 引用計數器 81
3.6 pool庫概述 82
3.7 pool 82
3.7.1 類摘要 83
3.7.2 操作函數 83
3.7.3 用法 84
3.8 object_pool 85
3.8.1 類摘要 85
3.8.2 操作函數 85
3.8.3 用法 86
3.8.4 更多的構造參數 87
3.9 singleton_pool 88
3.9.1 類摘要 88
3.9.2 用法 89
3.10 總結 90

第4章 實用工具 93
4.1 noncopyable 93
4.1.1 原理 94
4.1.2 用法 94
4.1.3 實現 95
4.2 ignore_unused 96
4.2.1 基本用法 96
4.2.2 模板用法 97
4.3 optional 98
4.3.1 類摘要 98
4.3.2 操作函數 99
4.3.3 用法 100
4.3.4 工廠函數 102
4.4 assign 102
4.4.1 list_inserter 102
4.4.2 operator = 103
4.4.3 operator () 105
4.4.4 generic_list 106
4.4.5 初始化容器 107
4.4.6 重復輸入 108
4.4.7 操作非標準容器 109
4.4.8 其他議題 110
4.5 tribool 111
4.5.1 類摘要 111
4.5.2 用法 112
4.5.3 為第三態更名 113
4.5.4 比較optional 114
4.6 operators 115
4.6.1 基本運算概念 115
4.6.2 算術操作符 116
4.6.3 基類鏈 119
4.6.4 復合運算概念 120
4.6.5 相等與等價 121
4.6.6 解引用操作符 123
4.6.7 下標操作符 124
4.6.8 布爾轉型操作符 125
4.6.9 二元操作符 126
4.7 exception 127
4.7.1 標準庫中的異常 127
4.7.2 類摘要 128
4.7.3 向異常傳遞信息 129
4.7.4 錯誤信息類 131
4.7.5 包裝標準異常 132
4.7.6 使用函數拋出異常 133
4.7.7 獲得更多信息 134
4.7.8 高級議題 135
4.8 uuid 137
4.8.1 類摘要 137
4.8.2 用法 138
4.8.3 生成器 140
4.8.4 增強用法 142
4.8.5 轉換字符串 143
4.9 config 144
4.9.1 編譯期字符串化 144
4.9.2 靜態整型常量 145
4.10 utility 145
4.10.1 二進制常量 146
4.10.2 調用函數名 147
4.11 總結 148
第5章 字符串與文本處理 151
5.1 lexical_cast 151
5.1.1 函數聲明 152
5.1.2 用法 152
5.1.3 錯誤處理 153
5.1.4 轉換要求 155
5.1.5 轉換自定義類 155
5.1.6 對比標準 156
5.2 format 157
5.2.1 簡單的例子 158
5.2.2 輸入操作符 159
5.2.3 類摘要 160
5.2.4 格式化語法 162
5.2.5 性能優化 163
5.2.6 高級用法 163
5.3 string_ref 164
5.3.1 類摘要 165
5.3.2 用法 166
5.4 string_algo 168
5.4.1 簡單示例 168
5.4.2 算法概述 169
5.4.3 大小寫轉換 170
5.4.4 判斷式(算法) 171
5.4.5 判斷式(函數物件) 172
5.4.6 分類 173
5.4.7 修剪 174
5.4.8 查找 175
5.4.9 替換與刪除 177
5.4.10 分割 178
5.4.11 合並 180
5.4.12 查找(分割)迭代器 181
5.5 xpressive 182
5.5.1 使用方式 182
5.5.2 正則表達式簡介 183
5.5.3 類摘要 184
5.5.4 正則匹配 186
5.5.5 正則查找 189
5.5.6 正則替換 190
5.5.7 正則迭代 191
5.5.8 正則分詞 192
5.5.9 高級議題 193
5.6 總結 196
第6章 正確性與測試 197
6.1 assert 197
6.1.1 基本用法 197
6.1.2 禁用斷言 198
6.1.3 擴展用法 199
6.2 static_assert 201
6.2.1 定義 201
6.2.2 用法 201
6.3 lightweight_test 203
6.3.1 測試斷言 203
6.3.2 用法 204
6.3.3 測試元編程 205
6.4 test 205
6.4.1 測試斷言 206
6.4.2 測試主體 207
6.4.3 測試實例 209
6.4.4 測試夾具 211
6.4.5 測試日志 213
6.4.6 運行參數 214
6.4.7 高級議題 215
6.5 總結 218
第7章 容器與數據結構 219
7.1 array 219
7.1.1 類摘要 220
7.1.2 操作函數 221
7.1.3 用法 222
7.1.4 能力限制 222
7.1.5 初始化 223
7.1.6 對比標準 223
7.2 dynamic_bitset 224
7.2.1 類摘要 224
7.2.2 創建與賦值 225
7.2.3 容器操作 227
7.2.4 基本運算 228
7.2.5 訪問元素 228
7.2.6 類型轉換 230
7.2.7 集合操作 231
7.2.8 綜合運用 231
7.3 unordered 233
7.3.1 散列集合簡介 233
7.3.2 散列集合的用法 235
7.3.3 散列映射簡介 237
7.3.4 散列映射的用法 239
7.3.5 高級議題 240
7.4 bimap 242
7.4.1 類摘要 242
7.4.2 基本用法 243
7.4.3 值的集合類型 245
7.4.4 集合類型的用法 246
7.4.5 使用標簽類型 247
7.4.6 使用assign庫 249
7.4.7 查找與替換 249
7.4.8 投射 251
7.4.9 高級議題 252
7.5 circular_buffer 253
7.5.1 類摘要 253
7.5.2 用法 254
7.5.3 環形結構 255
7.5.4 空間優化 256
7.6 tuple 257
7.6.1 二元組 257
7.6.2 類摘要 258
7.6.3 創建與賦值 258
7.6.4 訪問元素 260
7.6.5 比較操作 261
7.6.6 輸入輸出 262
7.6.7 聯結變量 263
7.6.8 內部結構 263
7.6.9 使用訪問者模式 265
7.6.10 高級議題 266
7.7 any 269
7.7.1 類摘要 269
7.7.2 訪問元素 270
7.7.3 用法 271
7.7.4 簡化操作 272
7.7.5 保存指針 273
7.7.6 高級議題 274
7.8 variant 275
7.8.1 類摘要 276
7.8.2 訪問元素 277
7.8.3 用法 277
7.8.4 訪問器 278
7.8.5 高級議題 281
7.9 multi_array 283
7.9.1 類摘要 283
7.9.2 用法 284
7.9.3 改變形狀和大小 286
7.9.4 創建子視圖 287
7.9.5 適配普通數組 288
7.9.6 高級議題 289
7.10 property_tree 291
7.10.1 類摘要 292
7.10.2 讀取配置信息 293
7.10.3 寫入配置信息 295
7.10.4 更多用法 296
7.10.5 數據格式 297
7.10.6 高級議題 300
7.11 總結 301
第8章 算法 305
8.1 foreach 305
8.1.1 用法 306
8.1.2 詳細解說 307
8.1.3 更優雅的名字 308
8.1.4 支持的序列類型 308
8.1.5 存在的問題 309
8.2 minmax 310
8.2.1 用法 310
8.2.2 存在的問題 311
8.3 minmax_element 312
8.3.1 基本用法 312
8.3.2 其他用法 313
8.4 algorithm 313
8.4.1 clamp 314
8.4.2 clamp_range 314
8.4.3 hex/unhex 315
8.5 總結 316
第9章 數學與數字 317
9.1 math.constants 317
9.1.1 基本用法 318
9.1.2 高級用法 319
9.2 integer 319
9.2.1 整數特徵 319
9.2.2 標準整數類型 321
9.2.3 整數類型模板類 322
9.3 rational 326
9.3.1 類摘要 326
9.3.2

您曾經瀏覽過的商品

購物須知

大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。

特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。

無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。

為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。

若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

優惠價:87 616
缺貨無法訂購

暢銷榜

客服中心

收藏

會員專區