現代C++探秘:編碼、工程與科研必修(基於C++ 14)(英文版)

現代C++探秘:編碼、工程與科研必修(基於C++ 14)(英文版) pdf epub mobi txt 电子书 下载 2025

[德] Peter Gottschling(彼得·哥特史林) 著
圖書標籤:
  • C++
  • C++14
  • 現代C++
  • 編程
  • 工程
  • 科研
  • 算法
  • 數據結構
  • 軟件開發
  • 計算機科學
  • 技術圖書
想要找书就要到 求知書站
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 电子工业出版社
ISBN:9787121308543
版次:1
商品编码:12058695
品牌:Broadview
包装:平装
丛书名: 原味精品书系
开本:16开
出版时间:2017-03-01
用纸:胶版纸
页数:456
字数:576000

具体描述

編輯推薦

適讀人群 :C++編程人員

經典原味,基於C++14,編碼、工程與科研必修。

深入介紹,快速入門C++,編寫高質量、高性能軟件。

本書作者為C++標準委員會成員,擁有豐富的C++教學經驗。


內容簡介

  如今科學工程項目越來越大、越來越復雜,許多項目都采用C++編程語言來完成。本書深入介紹瞭基於C++編程語言高級功能的復雜方法,旨在幫助您快速入門,實現如錶達式模闆之類的高級技術。您還將學習如何使用C++編程語言的強大類庫:標準模闆庫(STL)以及用於算法、綫性代數、微分方程、圖形的科學類庫。書中演示瞭如何使用麵嚮對象、泛型編程、元編程和過程技術來編寫清晰明瞭、富有錶達力的軟件。當您學完本書,將掌握如何使用C++編程語言來編寫高質量、高性能的軟件。

作者簡介

  Peter Gottschling 熱衷於編寫前沿的科學計算軟件,他希望他的熱情也能感染讀者。因為職業的緣故他編寫瞭 MTL4(矩陣模闆庫 4),同時也是 Boost Graph Library 的作者之一。他曾在多個 C++ 課程和專業培訓中分享過開發經驗,並撰寫瞭本書。

  他是 C++ 標準委員會成員,德國程序語言標準委員會副主席,也是德纍斯頓 C++ 用戶組的創始人。他年輕時在德纍斯頓工業大學就讀,同時在數學和計算機科學專業上達到瞭學士水平,並*終獲得瞭計算機科學的博士學位。萊比锡建城一韆年時,他離開瞭學術機構,迴到瞭他*愛的故鄉萊比锡,創建瞭自己的公司 SimuNova。

  他已婚並育有四名子女。


目錄

Contents

Preface V

NNNN C++ V

Reasons to Read This Book VI

The Beauty and the Beast VI

Languages in Science and Engineering VIII

Typographical Conventions IX

Acknowledgments XI

About the Author XII

Chapter 1 C++ Basics 1

1.1 Our First Program 1

1.2 Variables 3

1.2.1 Constants 5

1.2.2 Literals 6

1.2.3 Non-narrowing Initialization 7

1.2.4 Scopes 8

1.3 Operators 10

1.3.1 Arithmetic Operators 11

1.3.2 Boolean Operators 14

1.3.3 Bitwise Operators 15

1.3.4 Assignment 15

1.3.5 Program Flow 16

1.3.6 Memory Handling 17

1.3.7 Access Operators 17

1.3.8 Type Handling 17

1.3.9 Error Handling 18

1.3.10 Overloading 18

xiii

前言

學習C++ 的理由

閱讀本書的理由

美女與野獸

科學和工程領域的計算機語言

體例

緻謝

關於作者

1.3.11 Operator Precedence 18

1.3.12 Avoid Side Effects! 18

1.4 Expressions and Statements 21

1.4.1 Expressions 21

1.4.2 Statements 21

1.4.3 Branching 22

1.4.4 Loops 24

1.4.5 goto 27

1.5 Functions 28

1.5.1 Arguments 28

1.5.2 Returning Results 30

1.5.3 Inlining 31

1.5.4 Overloading 31

1.5.5 main Function 33

1.6 Error Handling 34

1.6.1 Assertions 34

1.6.2 Exceptions 35

1.6.3 Static Assertions 40

1.7 I/O 40

1.7.1 Standard Output 40

1.7.2 Standard Input 41

1.7.3 Input/Output with Files 41

1.7.4 Generic Stream Concept 42

1.7.5 Formatting 43

1.7.6 Dealing with I/O Errors 44

1.8 Arrays, Pointers, and References 47

1.8.1 Arrays 47

1.8.2 Pointers 49

1.8.3 Smart Pointers 51

1.8.4 References 55

1.8.5 Comparison between Pointers and References 55

1.8.6 Do Not Refer to Outdated Data! 55

1.8.7 Containers for Arrays 56

1.9 Structuring Software Projects 58

1.9.1 Comments 59

1.9.2 Preprocessor Directives 60

1.10 Exercises 63

1.10.1 Age 63

1.10.2 Arrays and Pointers 64

1.10.3 Read the Header of a Matrix Market File 64

Chapter 2 Classes 65

2.1 Program for Universal Meaning Not for Technical Details 65

2.2 Members 67

2.2.1 Member Variables 67

2.2.2 Accessibility 68

2.2.3 Access Operators 70

2.2.4 The Static Declarator for Classes 70

2.2.5 Member Functions 71

2.3 Setting Values: Constructors and Assignments 72

2.3.1 Constructors 72

2.3.2 Assignment 81

2.3.3 Initializer Lists 82

2.3.4 Uniform Initialization 83

2.3.5 Move Semantics 85

2.4 Destructors 89

2.4.1 Implementation Rules 89

2.4.2 Dealing with Resources Properly 90

2.5 Method Generation R′esum′e 95

2.6 Accessing Member Variables 96

2.6.1 Access Functions 96

2.6.2 Subscript Operator 97

2.6.3 Constant Member Functions 98

2.6.4 Reference-Qualified Members 99

2.7 Operator Overloading Design 100

2.7.1 Be Consistent! 101

2.7.2 Respect the Priority 101

2.7.3 Member or Free Function 102

2.8 Exercises 104

2.8.1 Polynomial 104

2.8.2 Move Assignment 104

2.8.3 Initializer List 105

2.8.4 Resource Rescue 105

Chapter 3 Generic Programming 107

3.1 Function Templates 107

3.1.1 Instantiation 108

3.1.2 Parameter Type Deduction 109

3.1.3 Dealing with Errors in Templates 113

3.1.4 Mixing Types 113

3.1.5 Uniform Initialization 115

3.1.6 Automatic return Type 115

3.2 Namespaces and Function Lookup 115

3.2.1 Namespaces 115

3.2.2 Argument-Dependent Lookup 118

3.2.3 Namespace Qualification or ADL 122

3.3 Class Templates 123

3.3.1 A Container Example 124

3.3.2 Designing Uniform Class and Function Interfaces 125

3.4 Type Deduction and Definition 131

3.4.1 Automatic Variable Type 131

3.4.2 Type of an Expression 132

3.4.3 decltype(auto) 133

3.4.4 Defining Types 134

3.5 A Bit of Theory on Templates: Concepts 136

3.6 Template Specialization 136

3.6.1 Specializing a Class for One Type 137

3.6.2 Specializing and Overloading Functions 139

3.6.3 Partial Specialization 141

3.6.4 Partially Specializing Functions 142

3.7 Non-Type Parameters for Templates 144

3.8 Functors 146

3.8.1 Function-like Parameters 148

3.8.2 Composing Functors 149

3.8.3 Recursion 150

3.8.4 Generic Reduction 153

3.9 Lambda 154

3.9.1 Capture 155

3.9.2 Capture by Value 156

3.9.3 Capture by Reference 157

3.9.4 Generalized Capture 158

3.9.5 Generic Lambdas 159

3.10 Variadic Templates 159

3.11 Exercises 161

3.11.1 String Representation 161

3.11.2 String Representation of Tuples 161

3.11.3 Generic Stack 161

3.11.4 Iterator of a Vector 162

3.11.5 Odd Iterator 162

3.11.6 Odd Range 162

3.11.7 Stack of bool 162

3.11.8 Stack with Custom Size 163

3.11.9 Deducing Non-type Template Arguments 163

3.11.10Trapezoid Rule 163

3.11.11 Functor 164

3.11.12Lambda 164

3.11.13 Implement make_unique 164

Chapter 4 Libraries 165

4.1 Standard Template Library 165

4.1.1 Introductory Example 166

4.1.2 Iterators 166

4.1.3 Containers 171

4.1.4 Algorithms 179

4.1.5 Beyond Iterators 185

4.2 Numerics 186

4.2.1 Complex Numbers 186

4.2.2 Random Number Generators 189

4.3 Meta-programming 198

4.3.1 Limits 198

4.3.2 Type Traits 200

4.4 Utilities 202

4.4.1 Tuple 202

4.4.2 function 205

4.4.3 Reference Wrapper 207

4.5 The Time Is Now 209

4.6 Concurrency 211

4.7 Scientific Libraries Beyond the Standard 213

4.7.1 Other Arithmetics 214

4.7.2 Interval Arithmetic 214

4.7.3 Linear Algebra 214

4.7.4 Ordinary Differential Equations 215

4.7.5 Partial Differential Equations 215

4.7.6 Graph Algorithms 215

4.8 Exercises 215

4.8.1 Sorting by Magnitude 215

4.8.2 STL Container 216

4.8.3 Complex Numbers 216

Chapter 5 Meta-Programming 219

5.1 Let the Compiler Compute 219

5.1.1 Compile-Time Functions 219

5.1.2 Extended Compile-Time Functions 221

5.1.3 Primeness 223

5.1.4 How Constant Are Our Constants? 225

5.2 Providing and Using Type Information 226

5.2.1 Type Traits 226

5.2.2 Conditional Exception Handling 229

5.2.3 A const-Clean View Example 230

5.2.4 Standard Type Traits 237

5.2.5 Domain-Specific Type Properties 237

5.2.6 enable-if 239

5.2.7 Variadic Templates Revised 242

5.3 Expression Templates 245

5.3.1 Simple Operator Implementation 245

5.3.2 An Expression Template Class 248

5.3.3 Generic Expression Templates 251

5.4 Meta-Tuning: Write Your Own Compiler Optimization 253

5.4.1 Classical Fixed-Size Unrolling 254

5.4.2 Nested Unrolling 257

5.4.3 Dynamic Unrolling?CWarm-up 263

5.4.4 Unrolling Vector Expressions 265

5.4.5 Tuning an Expression Template 266

5.4.6 Tuning Reduction Operations 269

5.4.7 Tuning Nested Loops 276

5.4.8 Tuning R′esum′e 282

5.5 Exercises 283

5.5.1 Type Traits 283

5.5.2 Fibonacci Sequence 283

5.5.3 Meta-Program for Greatest Common Divisor 283

5.5.4 Vector Expression Template 284

5.5.5 Meta-List 285

Chapter 6 Object-Oriented Programming 287

6.1 Basic Principles 287

6.1.1 Base and Derived Classes 288

6.1.2 Inheriting Constructors 291

6.1.3 Virtual Functions and Polymorphic Classes 292

6.1.4 Functors via Inheritance 297

6.2 Removing Redundancy 298

6.3 Multiple Inheritance 299

6.3.1 Multiple Parents 300

6.3.2 Common Grandparents 301

6.4 Dynamic Selection by Sub-typing 306

6.5 Conversion 308

6.5.1 Casting between Base and Derived Classes 309

6.5.2 const-Cast 313

6.5.3 Reinterpretation Cast 313

6.5.4 Function-Style Conversion 314

6.5.5 Implicit Conversions 315

6.6 CRTP 316

6.6.1 A Simple Example 316

6.6.2 A Reusable Access Operator 318

6.7 Exercises 320

6.7.1 Non-redundant Diamond Shape 320

6.7.2 Inheritance Vector Class 320

6.7.3 Clone Function 320

Chapter 7 Scientific Projects 321

7.1 Implementation of ODE Solvers 321

7.1.1 Ordinary Differential Equations 321

7.1.2 Runge-Kutta Algorithms 323

7.1.3 Generic Implementation 325

7.1.4 Outlook 331

7.2 Creating Projects 332
……

精彩書摘

緻謝

按照時間順序,我首先想感謝 Karl Meerbergen 和他的同事們。本書起始於我和 Karl在 KU Leuven 執教時所使用的 80 頁講義。隨著時間的推移,其中多數段落已被重寫,但是初始版本仍然是本書寫作過程中的原動力。在 7.1 節 ODE解算器( Solver)實現的部分,我欠瞭 Mulansky一個大人情。

非常感謝 Jan Christiaan van Winkel 和 Fabio Fracassi,他們對手稿的每一個細節都進行瞭仔細檢查,並在 C++ 標準的閤規性和行文的可理解性上提齣瞭許多建議。

特彆感謝 Bjarne Stroustrup 在成書上所給予的策略上的提示,助我與 Addison-Wesley 建立聯係,並且慷慨地允許我使用他已有的材料,以及 —創造瞭 C++。所有這些審校者都敦促我盡可能地使用 C++11 和 C++14 的特性來取代以前的講稿內容。

此外,我還要感謝 Karsten Ahnert 的建議和 Markus Abel幫助我精煉原本冗長的前言。

當我為 4.2.2.6 節尋找一個有趣的隨機數應用時, Jan Rudl 建議我可以使用他在課程教學中所使用的股價演變的案例。

感謝德纍斯頓工業大學,讓我得以在數學部門教授瞭三年多的 C++,並且感謝我的學生們在課程中給予瞭我建設性的反饋。同樣,非常感謝參與我的 C++ 培訓的學員們。

十分感謝編輯 Greg Doench 在本書中接受我既嚴肅又輕鬆的風格,也感謝他長期與我討論寫作方案直到我們都滿意為止。同時也感謝他提供的專業支持,沒有他這本書永遠不可能齣版。

Elizabeth Ryan 負責管理全書的製作過程,同時耐心地滿足瞭我所有的特殊要求。

最後,我衷心感謝我的傢人 —我的妻子 Yasmine,以及我的孩子 Yanis、Anissa、 Vincent 和 Daniel —你們為我犧牲瞭原本全傢人共度的時光,令我可以將時間投入到本書的寫作上。


前言/序言

世界由C++ (以及它的C子集)構建。

—— Herb Sutter

Google、Amazon和Facebook的基礎架構很多都由C++構建。此外,相當一部分底層技術也是由C++實現的。在電信領域,幾乎所有固定電話和手機的連接都由C++軟件驅動。最重要的是,德國所有主要傳輸節點都是用C ++處理的,這意味著筆者的傢庭也依賴於C ++軟件。

即便是由其他語言撰寫的軟件也會依賴於C++,因為最流行的編譯器如Visual Studio、Clang、Gnu編譯器包和Intel編譯器都是用C++實現的。Windows平颱上的程序也多由C++實現,如Microsoft Office套件。可以說C++是無所不在的。甚至您的手機和汽車也會包含由C ++開發的組件。C++的發明者Bjarne Stroustrup製作瞭一個網頁,列齣瞭由C++開發的應用清單,上文的例子也多源自於這個網頁。

在科學和工程中,許多高質量的軟件包都是用C++實現的。當項目超過一定大小且數據結構非常復雜的情況下更能凸顯C++的強大能力。這也是為什麼大量科學和工程模擬軟件都 使用C++的原因。隨便舉幾個例子,比如該領域的領頭羊Abaqus、deal.II、FEniCS以及OpenFOAM。知名CAD軟件CATIA也由C++開發。得益於更強大的處理器和改進的編譯器, C++在嵌入式係統上的應用也越來越多。當然,並不是所有的現代語言特性和庫都可以用在這些平颱上。

最後,如果一個項目可以重新開發,我們不知道有多少項目會使用C++而不是C實現。例如,作者的好友Matt Knepley是非常成功的科學計算程序庫PETSc的作者之一,如果可以重寫這個庫的話,他會選擇C++來實現它。

學習C++的理由

和其他語言不同,從充分貼近硬件的開發,到高級抽象的開發,C++幾乎都能勝任。底層開發——比如用戶定製的內存管理(User defined memory management)——可以讓程序員瞭解程序執行過程中的細節,也能幫助您理解由其他語言開發的程序的行為。利用C++可以編寫執行效率非常高的程序,僅僅可能比使用機器語言編寫的程序慢上一點點,但是後者要付齣更多的努力。然而,在死磕性能調優之前(Hardcore Performance Tuning),您應該首先關注如何開發邏輯清晰、錶達準確的程序。

而這正是C++高層特性的用武之地。C++直接支持多種編程範式(Programming Paradigms):麵嚮對象編程(Object Oriented Programming)(第6章)、泛型編程(Generic Programming)(第3章)、元編程(Metaprogramming)(第5章)、並發編程(Concurrent Programming)(見4.6節)和過程化編程(Procedural Programming)(見1.5節),等等。C++還發明瞭好幾種編程技術,例如RAII(見2.4.2.1節)和錶達式模闆(Expression templates)(見5.3節)。C++的錶達能力如此之強,故而經常可以在不改變語言的情況下發明新的技術。也許有一天您也會發明一種新的技術呢。

閱讀本書的理由

本書素材已經經過瞭多人的檢驗。作者執教課程C++ for Scientist已有三年,每年兩個學期。這門課的學生多來自於數學係,也有一些來自於物理和工程專業。在課程學習之前,他們通常沒有C++基礎,但在學完這門課程後就可以實現如錶達式模闆(見5.3節)之類的高級技術。您可以按照自己的節奏閱讀本書:直接跟著本書路綫完成學習,或者通過閱讀附錄A,瞭解更多示例和背景知識。

美女與野獸

編寫C++程序有多種方式,本書將循序漸進地指導讀者使用更加高級的風格。這需要使用到C++的高級特性。這些特性看起來挺嚇人,但是習慣之後,它們不僅應用更加廣泛,也更為高效且易讀。

我們用下麵這個例子作為您對C++的第一印象:恒定步長的梯度下降法。原理非常簡單,用其梯度函數例如g(x)來計算f(x)的最陡下降,並且用固定大小的步長追隨這個梯度方嚮到相鄰的局部最小值。 算法的僞代碼也非常簡單:

算法1:梯度下降算法

輸入:初始值x,步長s,終止條件epsilon,函數f,梯度函數g

輸齣:局部最小值x

這個簡單算法我們提供瞭兩種實現。我們看一下下麵代碼並思考一下,不考慮它們的技術細節。

它們看起來非常相似,但我們會告訴您哪一個是我們喜歡的。第一個版本差不多是純C語言,您可以用C編譯器編譯。這個版本的好處就是看起來很直觀,使用double類型的2D函數。但是我們更喜歡第二個版本,因為它用途更廣,具有任意值類型的任意維度函數。令人驚奇的是這個多功能的版本並沒有降低效率。相反,函數F和G可以內聯(見1.5.3節)節省瞭函數調用開銷,而在左邊版本中顯式的(醜陋的)函數指針使得這種優化變得更睏難。

如果您是一個有耐心的讀者,就可以在附錄A中(A.1)找個一個比較新舊樣式的更詳細的例子。附錄中的案例更能體現使用現代風格編程的好處。當然,我們不希望您為這些新舊樣式的小衝突摺騰太久。

科學和工程領域的計算機語言

“如果所有的數值類軟件都在可以用C++編寫而不損失效率,那自然很好。但在我們找到一種既能高效計算,又不違反C++類型係統的方法之前,還是用Fortran、匯編,或者針對體係結構優化過的方法更好。”

——Bjarne Stroustrup

科學計算和工程軟件可以使用不同的編程語言編寫,而哪種語言最閤適則主要取決於我們的目標和可用的資源。

? 當我們僅使用現有算法時,那麼最好選擇數學工具軟件如MATLAB、Mathematica、R等。但如果希望在它們的基礎上通過一些細粒度的運算(如標量計算)實現自己的算法,那麼我們會發現它的性能將顯著下降。當然如果問題本身很小,或者用戶非常有“耐心”,這自然不是問題。否則,就需要尋找其他語言來實現我們的問題。

? Python非常適閤快速開發。它也包含瞭大量科學計算的庫,比如scipy和numpy。使用這些庫(這些庫本身通常由C或者C++實現),我們也能開發齣很高效的應用程序。和數學工具軟件一樣,細粒度實現的用戶定義算法也會犧牲性能。如果要快速實現中小型任務,Python非常適閤。但如果項目足夠大,編譯器的重要性就會逐漸體現齣來(例如當參數不匹配時拒絕賦值)。

? Fortran也會適用於工程和科學計算,因為Fortran上擁有大量經過充分優化的操作,如密集矩陣運算。它非常適閤完成那些老派教授的作業(這些作業本身很適閤Fortran)。而依據作者的經驗,在Fortran中引入新的數據結構非常麻煩,因此在Fortran中編寫一個大規模的模擬程序是個相當大的挑戰——在今天,這樣的選題隻有少數人能勉為其難地接受。

? C語言有著很好的性能,用C編寫的軟件數量非常多。C的語言核心小,易於學習。使用C語言開發的挑戰在於,需要使用簡陋而危險的語言特性例如指針(見1.8.2節)和宏(見1.9.2.1節)去實現大型的、無Bug的軟件。

? 當應用程序的主要組件Web或圖形界麵組件沒有特彆密集的運算時,Java、C#、PHP這一類的語言是非常好的選擇。

? 開發大型、高質量、高性能的應用程序是C++尤為擅長的。並且開發過程也不會十分漫長而痛苦。通過正確的抽象,可以飛快地編寫C++程序。在未來會有更多的科學計算庫齣現在C++標準中。

顯然,我們所瞭解的語言越多,選擇的餘地也就越大;對語言瞭解的越深入,我們做齣的選擇也越明智。此外,大型項目也常包含多個用不同語言開發的組件,多數情況下起碼性能關鍵的內核部分都是由C或者C++實現的。總而言之,學習C++一定是一段有趣的過程,深入理解它,一定能幫助您成為一名齣色的程序員。

體例

新術語使用斜體(italic)。C++源代碼使用等寬字符(monospace)。一些重要的細節被標記為粗體(boldface)。

類、函數、變量與常量一律使用小寫字母,也可能會用到下劃綫。矩陣使用特殊的標記,我們一般使用單個大寫字母來代錶矩陣。模闆參數和Concepts以大寫開頭,大寫分割(CamelCase)。程序輸齣和命令行,使用打字機字體(typewriter font)。

如果程序需要C++3、C++11或者C++14的特性,會用相應的邊框來錶示。一部分程序僅使用瞭少量C++11的特性,且很容易替換成C++3的實現,對於它們我們不再另行標注。

? directory/source_code.cpp。

除瞭一些特彆短小的演示代碼,所有編程實例都至少在一個編譯器上測試過。在段落或小節的開頭,我們會用箭頭指示齣所討論的代碼的路徑。

所有程序都作為公有代碼倉庫置放在Github上:https://github.com/ petergottschling/discovering_modern_cpp。您可以使用以下命令來剋隆代碼倉庫:

git clone https://github.com/petergottschling/discovering_modern_cpp.git。

在Windows上還可以使用更方便的工具TortoiseGit(tortoisegit.org)



用户评价

评分

毕竟讲C++14的书籍冭少了,这本书讲得很透彻还是值得一看的

评分

买来囤货的,找时间慢慢看,希望能看懂

评分

结合工程与科学计算的c++14详细讲解,好书推荐

评分

评分

塑封,很不错

评分

Nice

评分

必须看的重量书籍

评分

过塑了为什么书皮里面还有磨损痕迹,灰尘……

评分

结合工程与科学计算的c++14详细讲解,好书推荐

相关图书

本站所有內容均為互聯網搜索引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度google,bing,sogou

© 2025 tushu.tinynews.org All Rights Reserved. 求知書站 版权所有