Data Structures and Algorithms with the C++ STL: A guide for modern C++ practitioners

Data Structures and Algorithms with the C++ STL: A guide for modern C++ practitioners

Data Structures and Algorithms with the C++ STL: A guide for modern C++ practitioners
Автор: Farrier John
Дата выхода: 2024
Издательство: Packt Publishing Limited
Количество страниц: 458
Размер файла: 3,0 МБ
Тип файла: PDF
Добавил: codelibs
 Проверить на вирусы  Дополнительные материалы 

Title page....2

Copyright and credits....3

Dedication....4

Contributors....5

Table of Contents....8

Preface....24

Part 1: Mastering std::vector....30

Chapter 1: The Basics of std::vector....32

Technical requirements....32

The significance of std::vector....32

A basic comparison of C-style arrays and std::vector....33

Comparison of C-style arrays and std::vector for memory management....36

Declaring and initializing std::vector....38

Declaring a vector....38

Initializing a vector....39

Accessing elements....42

Random access....42

Accessing the first and last elements....44

Vector size....44

Adding and removing elements....46

Adding elements....46

Removing elements....48

Capacity....50

Prefer using empty() when possible....51

Clearing all elements....51

Summary....53

Chapter 2: Mastering Iterators with std::vector....56

Technical requirements....56

Types of iterators in the STL....56

Input iterators....57

Output iterators....57

Forward iterators....58

Reverse iterators....59

Bidirectional iterators....59

Random access iterators....60

Basic iteration techniques with std::vector....62

Iterating over std::vector....62

Basic iteration using iterators....62

Using constant iterators....63

Benefits of iteration....63

Using std::begin and std::end....64

Understanding iterator requirements....66

Range-based for loops....67

Overview of range-based for loops....67

When to use range-based for loops....68

Modifying elements during iteration....68

Creating a custom iterator....69

The appeal of custom iterators....69

Core requirements....69

Iterator categories and their specialties....70

A custom iterator example....72

Custom iterator challenges and use cases....74

Illustrative use cases of custom iterators....74

Summary....78

Chapter 3: Mastering Memory and Allocators with std::vector....80

Technical requirements....80

Understanding capacity versus size....80

Revisiting the basics....81

What exactly is capacity?....81

Why this distinction matters....81

Looking under the hood....82

Resizing and reserving memory....84

The power of resize()....84

Enter reserve()....86

Optimizing with shrink_to_fit()....87

Real-world relevance....89

Custom allocator basics....89

The role and responsibility of an allocator....89

Under the hood – the allocator interface....90

Trade-offs and the need for custom allocators....92

Choosing std::allocator over new, delete, and managed pointers....93

Creating a custom allocator....94

Custom allocators – the heart of memory flexibility....94

Understanding the motivation behind custom allocators....95

Memory pools – a popular custom allocator strategy....95

Unlocking the potential of custom allocators....95

Allocators and container performance....96

Why allocators matter in performance....96

The performance characteristics of std::allocator....96

When to consider alternative allocators....97

Profiling – the key to making informed decisions....97

Summary....97

Chapter 4: Mastering Algorithms with std::vector....100

Technical requirements....100

Sorting a vector....100

Getting started with std::sort....101

The engine under the hood – introsort....101

Efficiency unparalleled – O(n log n)....101

Sorting in descending order....101

Sorting custom data types....102

Pitfalls and precautions....103

Searching elements....106

Linear search with std::find....106

Binary search techniques....106

Using std::lower_bound and std::upper_bound....107

Binary search versus linear search – efficiency and versatility....108

Manipulating vectors....109

Transforming with std::copy....110

Reversing elements with std::reverse....110

Rotating vectors with std::rotate....110

Filling a vector with std::fill....111

Putting manipulation to use....111

Considerations in manipulation....113

Custom comparators and predicates....114

Understanding comparators....114

The power of predicates....114

Crafting effective comparators and predicates....115

User-defined structs and classes....115

Understanding container invariants and iterator invalidation....116

Understanding iterator invalidation....116

Strategies to counteract invalidation....118

Dealing with invalidation in multi-threaded scenarios....120

Summary....122

Chapter 5: Making a Case for std::vector....124

Performance considerations....124

Comparison with other containers....125

The memory advantage....125

The takeaway....125

Practical use cases....126

A resizable dynamic array at heart....126

Data processing and analytics....126

Graphics and game development....126

Beyond just containers....126

Versatility and efficiency....127

A testament to versatility....127

Efficiency isn’t just about speed....127

A safe default, but not the only option....127

Summary....128

Part 2: Understanding STL Data Structures....130

Chapter 6: Advanced Sequence Container Usage....132

Technical requirements....133

std::array....133

Purpose and suitability....133

Ideal use cases....133

Performance....134

Memory management....135

Thread safety....135

Extensions and variants....135

Sorting and searching complexity....135

Interface and member functions....135

Comparisons....135

Interactions with algorithms....135

Exceptions....135

Customization....136

Example....136

Best practices....138

std::vector....138

Purpose and suitability....139

Ideal use cases....139

Performance....140

Memory management....140

Thread safety....140

Extensions and variants....140

Sorting and searching complexity....141

Special interface and member functions....141

Comparisons....141

Interactions with algorithms....141

Exceptions....141

Customization....141

Example....141

Best practices....145

std::deque....146

Purpose and suitability....146

Ideal use cases....146

Performance....147

Memory management....147

Thread safety....147

Extensions and variants....148

Sorting and searching complexity....148

Interface and member functions....148

Comparisons....148

Interactions with algorithms....148

Exceptions....148

Customization....148

Example....149

Best practices....151

std::list....151

Purpose and suitability....152

Ideal use cases....152

Performance....153

Memory management....153

Thread safety....153

Extensions and variants....154

Sorting and searching complexity....154

Interface and member functions....154

Comparisons....154

Interactions with algorithms....154

Exceptions....154

Customization....154

Example....155

Best practices....156

std::forward_list....157

Purpose and suitability....157

Ideal use cases....158

Performance....158

Memory management....159

Thread safety....159

Extensions and variants....159

Sorting and searching complexity....159

Special interface and member functions....159

Comparisons....159

Interactions with algorithms....160

Exceptions....160

Customization....160

Example....160

Best practices....162

std::string....163

Purpose and suitability....163

Ideal use cases....164

Performance....164

Memory management....164

Thread safety....164

Extensions and variants....164

Sorting and searching complexity....164

Special interface and member functions....165

Comparisons....165

Interactions with algorithms....165

Exceptions....165

Customization....165

Example....165

Best practices....167

Chapter 7: Advanced Ordered Associative Container Usage....170

Technical requirements....170

std::set....171

Purpose and suitability....171

Ideal use cases....171

Performance....172

Memory management....172

Thread safety....172

Extensions and variants....172

Sorting and searching complexity....172

Special interface and member functions....173

Comparisons....173

Interactions with algorithms....173

Exceptions....173

Customization....173

Example....173

Best practices....175

std::map....176

Purpose and suitability....176

Ideal use cases....177

Performance....177

Memory management....178

Thread safety....178

Extensions and variants....178

Sorting and searching complexity....178

Special interface and member functions....178

Comparisons....178

Interactions with algorithms....179

Exceptions....179

Customization....179

Example....179

Best practices....181

std::multiset....182

Purpose and suitability....182

Ideal use cases....182

Performance....183

Memory management....183

Thread safety....184

Extensions and variants....184

Sorting and searching complexity....184

Special interface and member functions....184

Comparisons....184

Interactions with algorithms....184

Exceptions....184

Customization....185

Example....185

Best practices....187

std::multimap....187

Purpose and suitability....187

Ideal use cases....188

Performance....189

Memory management....189

Thread safety....189

Extensions and variants....189

Sorting and searching complexity....189

Special interface and member functions....189

Comparisons....190

Interactions with algorithms....190

Exceptions....190

Customization....190

Example....190

Best practices....192

Chapter 8: Advanced Unordered Associative Container Usage....194

Technical requirements....194

std::unordered_set....195

Purpose and suitability....195

Ideal use cases....195

Performance....196

Memory management....196

Thread safety....196

Extensions and variants....196

Sorting and searching complexity....196

Special interface and member functions....196

Comparisons....197

Interactions with algorithms....197

Exceptions....197

Customization....197

Example....197

Best practices....199

std::unordered_map....200

Purpose and suitability....200

Ideal use cases....201

Performance....202

Memory management....202

Thread safety....202

Extensions and variants....202

Sorting and searching complexity....202

Special interface and member functions....202

Comparisons....203

Interactions with algorithms....203

Exceptions....203

Customization....203

Example....203

Best practices....205

std::unordered_multiset....206

Purpose and suitability....206

Ideal use cases....206

Performance....207

Memory management....207

Thread safety....207

Extensions and variants....208

Sorting and searching complexity....208

Special interface and member functions....208

Comparisons....208

Interactions with algorithms....208

Exceptions....208

Customization....208

Example....209

Best practices....211

std::unordered_multimap....212

Purpose and suitability....212

Ideal use cases....212

Performance....213

Memory management....213

Thread safety....214

Extensions and variants....214

Sorting and searching complexity....214

Special interface and member functions....214

Comparisons....214

Interactions with algorithms....214

Exceptions....214

Customization....215

Example....215

Best practices....217

Chapter 9: Advanced Container Adaptor Usage....220

Technical requirements....220

std::stack....220

Purpose and suitability....221

Ideal use cases....221

Performance....221

Memory management....222

Thread safety....222

Extensions and variants....222

Sorting and searching complexity....222

Special interface and member functions....222

Comparisons....222

Interactions with algorithms....222

Exceptions....222

Customization....223

Example....223

Best practices....225

std::queue....226

Purpose and suitability....226

Ideal use cases....226

Performance....227

Memory management....227

Thread safety....227

Extensions and variants....227

Sorting and searching complexity....227

Special interface and member functions....227

Comparisons....227

Interactions with algorithms....228

Exceptions....228

Customization....228

Example....228

Best practices....230

std::priority_queue....231

Purpose and suitability....231

Ideal use cases....231

Performance....231

Memory management....232

Thread safety....232

Extensions and variants....232

Sorting and searching complexity....232

Special interface and member functions....232

Comparisons....232

Interactions with algorithms....233

Exceptions....233

Customization....233

Example....233

Best practices....235

std::flat_set....236

Purpose and suitability....237

Ideal use cases....237

Performance....237

Memory management....238

Thread safety....238

Extensions and variants....238

Sorting and searching complexity....238

Special interface and member functions....238

Comparisons....238

Interactions with algorithms....238

Exceptions....239

Customization....239

Best practices....239

std::flat_map....240

Purpose and suitability....240

Ideal use cases....241

Performance....241

Memory management....241

Thread safety....241

Extensions and variants....241

Sorting and searching complexity....242

Interface and member functions....242

Comparisons....242

Interactions with algorithms....242

Exceptions....242

Customization....242

Best practices....242

std::flat_multiset....243

Purpose and suitability....243

Ideal use cases....244

Performance....244

Memory management....244

Thread safety....245

Extensions and variants....245

Sorting and searching complexity....245

Special interface and member functions....245

Comparisons....245

Interactions with algorithms....245

Exceptions....245

Customization....246

Best practices....246

std::flat_multimap....247

Purpose and suitability....247

Ideal use cases....247

Performance....248

Memory management....248

Thread safety....248

Extensions and variants....248

Sorting and searching complexity....248

Interface and member functions....248

Comparisons....249

Interactions with algorithms....249

Exceptions....249

Customization....249

Best practices....249

Chapter 10: Advanced Container View Usage....252

Technical requirements....252

std::span....252

Purpose and suitability....253

Ideal use cases....253

Performance....253

Memory management....253

Thread safety....254

Extensions and variants....254

Sorting and searching complexity....254

Interface and member functions....254

Comparisons....254

Interactions with algorithms....254

Exceptions....254

Customization....254

Example....255

Best practices....257

std::mdspan....257

Purpose and suitability....258

Ideal use cases....258

Performance....258

Memory management....258

Thread safety....259

Extensions and variants....259

Sorting and searching complexity....259

Special interface and member functions....259

Comparisons....259

Interactions with algorithms....259

Exceptions....259

Customization....259

Best practices....260

Part 3: Mastering STL Algorithms....262

Chapter 11: Fundamental Algorithms and Searching....264

Technical requirements....264

Sorting....264

Checking conditions....266

Counting and finding....269

Searching and comparison....275

Best practices....279

Summary....281

Chapter 12: Manipulation and Transformation....282

Technical requirements....282

Copying and moving in STL containers....282

Copying semantics in the STL....283

Moving semantics in the STL....283

Copying versus moving – a deliberate choice....283

Exploring return value optimization....285

Filling and generating in STL containers....286

Populating with static assignment....286

Dynamic generation with the STL....286

Ensuring relevance and efficiency....287

Removing and replacing in STL containers....287

The essence of removal....288

Replacement....288

A balancing act....289

Swapping and reversing in STL containers....290

Swapping – the art of interchanging....290

Reversing – a glimpse from the end....290

Deduplication – singling out the unique....290

Sampling – a slice of the whole....290

Best practices....291

Summary....292

Chapter 13: Numeric and Range -Based Operations....294

Technical requirements....294

Basic numeric operations....294

Generating sequences with std::iota....295

Summing elements with std::accumulate....296

Adjacent elements and their interactions with std::adjacent_difference....297

Inner products with std::inner_product....299

Advanced numeric operations....300

Operations on sorted ranges....302

Best practices....305

Summary....306

Chapter 14: Permutations, Partitions, and Heaps....308

Technical requirements....308

Partitioning....308

std::partition and its power....309

Checking partitions with std::is_partitioned....309

The utility of std::partition_point....309

Partitioning beyond basic sequences....309

Permutations....310

Generating permutations with std::next_permutation....311

Predecessor permutations with std::prev_permutation....311

Shuffling elements randomly with std::shuffle....311

Rotating sequences with std::rotate....312

Heap operations....313

Constructing heaps with std::make_heap....314

Adding and removing elements – std::push_heap and std::pop_heap....314

Heap-based sorting – the power of std::sort_heap....314

Checking heap validity with std::is_heap....315

The significance of heaps in today’s computing....315

Best practices....316

Summary....317

Chapter 15: STL with Ranges....318

Technical requirements....318

Introduction to ranges....318

Understanding the essence of ranges....319

Why the shift to ranges?....319

A glimpse into range operations....319

Looking ahead – the power of modern STL....320

Ranges for sorting algorithms....320

Traditional STL sorting – a recap....321

Range-based sorting – the basics....321

Embracing composability in sorting....321

Advantages beyond syntax – why ranges shine in sorting....322

The revolution of ranges in sorting....323

Ranges for searching algorithms....323

Finding elegance – range-based searching....324

Chaining and filtering – the beauty of composability....324

Understanding views in searches....325

The extended toolkit – more than just find....325

Best practices....326

Embracing the power of chaining....326

Guarding against range pitfalls – lifetime awareness....326

Performance considerations – laziness and evaluation....327

Readability over brevity – striking the balance....327

Adhering to range idioms – keep it standard....327

Summary....328

Part 4: Creating STL-Compatible Types and Algorithms....330

Chapter 16: Creating STL-Types Containers....332

Technical requirements....332

The advantages of STL-compatible types....332

One language, one approach....333

Reusability – the gift that keeps giving....333

Efficiency in the familiar....333

Paving the way forward....334

Interacting with STL algorithms....334

The centrality of iterators....334

Adapting to algorithmic expectations....335

Error handling and feedback mechanisms....335

Algorithmic efficiency and your type....337

Laying a solid foundation....337

Essential requirements for compatibility....337

The cornerstones of compatibility....338

The vitality of iterators....338

Embracing value semantics....338

Operational guarantees....338

Size and capacity queries....338

Element access and manipulation....339

Consistency in exception safety....339

Looking forward to enhanced integration....341

Crafting iterators for custom types....341

Choosing the right iterator type....341

Crafting the basic components....342

Addressing iterator categories with type traits....342

End iterators – signifying the finish line....342

Considerations for const iterators....342

Performance optimizations and advanced techniques....344

Embracing the iterative spirit....344

Effective operator overloading....345

Operator overloading in C++....345

Considerations in overloading....345

Implementing arithmetic operators for custom types....345

Overloading relational operators for clear comparisons....346

Simplifying tasks with assignment and compound assignment....348

Stream operators for efficient I/O....348

Operator precedence and associativity in overloading....348

The role of operator overloading in C++....348

Creating custom hash functions....348

Interoperability with STL containers....348

Custom type semantics....349

The characteristics of a good hash function....349

Example for the creation of a custom hash function....350

Summary....352

Chapter 17: Creating STL -Compatible Algorithms....354

Technical requirements....354

Template functions....354

A primer on function templates....355

Variadic templates – multiplicity in templates....355

SFINAE – fine-tuning template substitution....355

Harnessing SFINAE with std::enable_if....355

Overloading....358

Crafting multiple algorithm versions for STL containers....358

Function resolution – navigating the intricacies....358

Overloading with care – clarity and consistency....359

Creating generic algorithms....359

Toward a type-independent approach....360

Embracing iterators – the bridge to generics....360

Predicates – customizing algorithm behavior....360

The magic of functors – enhancing flexibility....361

Customizing existing algorithms....361

Looking at the decorator pattern in action....362

Harnessing the power of lambda functions....364

Mixing patterns with lambdas for ultimate customization....364

Summary....367

Chapter 18: Type Traits and Policies....368

Technical requirements....368

Understanding and using type traits....368

Enhancing code adaptability with type traits....369

Empowering metaprogramming with type traits....369

Toward more informed and adaptable code....369

Utilizing type traits with the STL....370

Working with data types....370

Working with algorithms....371

Understanding and using policies in C++....374

Benefits with respect to the STL....374

Building modular components using policies....376

Potential challenges....376

The role of policies in modern C++....376

Using policies with the STL....377

Memory allocation policies....377

Sorting policies for versatile algorithms....377

Fine-tuning data structures with policies....378

Summary....379

Part 5: STL Data Structures and Algorithms: Under the Hood....382

Chapter 19: Exception Safety....384

Technical requirements....384

Basic exception safety....384

The pivotal role of program invariants in the STL....385

Resource integrity – the guardian of robust software....386

Harnessing the STL for basic exception safety....386

Strong exception safety....387

Navigating STL containers with strong guarantees....387

Crafting custom STL containers with strong guarantees....387

Infusing exception safety into custom STL algorithms....391

Exception safety is the path to robust applications....391

The effect of noexcept on STL operations....392

An introduction to noexcept....392

Application to STL data types....392

Application to STL algorithms....392

Summary....393

Chapter 20: Thread Safety and Concurrency with the STL....394

Technical requirements....395

Concurrency versus thread safety....395

Thread safety – a pillar for stable concurrency....395

The interplay of concurrency and thread safety....395

Challenges and rewards....396

Concurrency without thread safety – a recipe for chaos....396

Understanding thread safety....396

Thread safety in STL containers – laying the groundwork....396

Grasping the thread-safe nature of STL algorithms....397

Race conditions – the ghosts in the machine....397

Safeguarding concurrency – the way forward....398

Race conditions....399

Steering clear of a silent peril – race conditions in the STL....399

The anatomy of a race condition in the STL....399

More than meets the eye....399

Anticipating race conditions....400

Safeguarding your code – a proactive stance....400

Mutexes and locks....400

From manual to automatic – lock guards and unique locks....401

Avoiding the stalemate – deadlock prevention....401

Incorporating mutexes with STL containers....401

STL containers and thread safety....402

When safety needs reinforcements – concurrent modifications....402

Container iterators – the fragile bridge....402

Containers with a built-in shield – concurrent containers....402

Specific container concerns....403

Behaviors of std::vector in multi-threading....403

Characteristics of std::list in concurrency....403

Considerations with associative containers....404

Concurrency aspects of unordered containers....404

Insights into container adaptors....404

Concurrency support within the STL....404

Introduction to threads....405

The advent of asynchronous tasks....405

Atomic operations....405

Potential concurrent challenges....406

Using the STL’s concurrency features....406

Using std::thread, std::async, std::future, and thread -local storage....409

Initiating threads using std::thread....409

Managing asynchronous operations with std::async and std::future....409

Preserving data consistency using thread-local storage....410

Integrating tools for proficient concurrency....410

Concurrent data structures in the STL....412

The STL’s concurrency-optimized containers....412

Striving for maximum efficiency in concurrent environments....413

Best practices in action....413

Summary....416

Chapter 21: STL Interaction with Concepts and Coroutines....418

Technical requirements....418

Concepts....419

A brief introduction to concepts....419

Refined constraints in STL algorithms....419

Effectively constraining templates....419

Enhanced data structures with explicit requirements....422

Custom concepts and STL interactions....422

Potential challenges and caveats....423

Coroutines....424

Understanding coroutines – a refresher....424

STL algorithms and coroutine integration....425

Coroutines and STL data structures....425

Potential synergies with ranges and views....425

Looking ahead: A ahead – a paradigm shift....428

Summary....429

Chapter 22: Parallel Algorithms with the STL....430

Technical requirements....430

Introduction to execution policies....430

The header– enabling parallelism in STL algorithms....431

Implementing parallel execution....431

Reflecting on the transition to parallel STL....431

Incorporating execution policies....432

Integrating policies with standard algorithms....432

Understanding parallel execution policies....433

Selecting the appropriate execution policy....433

The impact of constexpr on algorithms and containers....434

Evolution of constexpr....434

Algorithms and the role of constexpr....434

Containers and constexpr integration....435

Performance considerations....436

Parallelism overhead....436

Determining optimal data size....436

Data access and synchronization challenges....436

False sharing – a subtle performance issue....437

Load balancing....437

The importance of profiling....437

Summary....438

Index....440

Other Books You May Enjoy....455

While the Standard Template Library (STL) offers a rich set of tools for data structures and algorithms, navigating its intricacies can be daunting for intermediate C++ developers without expert guidance. This book offers a thorough exploration of the STL's components, covering fundamental data structures, advanced algorithms, and concurrency features.

Starting with an in-depth analysis of the std:: vector, this book highlights its pivotal role in the STL, progressing toward building your proficiency in utilizing vectors, managing memory, and leveraging iterators. The book then advances to STL's data structures, including sequence containers, associative containers, and unordered containers, simplifying the concepts of container adaptors and views to enhance your knowledge of modern STL programming. Shifting the focus to STL algorithms, you'll get to grips with sorting, searching, and transformations and develop the skills to implement and modify algorithms with best practices. Advanced sections cover extending the STL with custom types and algorithms, as well as concurrency features, exception safety, and parallel algorithms.

By the end of this book, you'll have transformed into a proficient STL practitioner ready to tackle real-world challenges and build efficient and scalable C++ applications.

What you will learn

  • Streamline data handling using the std:: vector
  • Master advanced usage of STL iterators
  • Optimize memory in STL containers
  • Implement custom STL allocators
  • Apply sorting and searching with STL algorithms
  • Craft STL-compatible custom types
  • Manage concurrency and ensure thread safety in STL
  • Harness the power of parallel algorithms in STL

Who this book is for

This book is for intermediate-level C++ developers looking to enhance their software development skills. Familiarity with basic C++ syntax and object-oriented programming (OOP) as well as some exposure to data structures and algorithms is assumed.

Tailored to software engineers, computer science students, and hobbyist programmers, this book delves into C++ STL for practical application, performance enhancement, and efficient coding practices.


Похожее:

Список отзывов:

Нет отзывов к книге.