Search icon CANCEL
Subscription
0
Cart icon
Your Cart (0 item)
Close icon
You have no products in your basket yet
Arrow left icon
Explore Products
Best Sellers
New Releases
Books
Videos
Audiobooks
Learning Hub
Newsletter Hub
Free Learning
Arrow right icon
timer SALE ENDS IN
0 Days
:
00 Hours
:
00 Minutes
:
00 Seconds
C++17 STL Cookbook
C++17 STL Cookbook

C++17 STL Cookbook: Discover the latest enhancements to functional programming and lambda expressions

eBook
$29.99 $43.99
Paperback
$54.99
Subscription
Free Trial
Renews at $19.99p/m

What do you get with a Packt Subscription?

Free for first 7 days. $19.99 p/m after that. Cancel any time!
Product feature icon Unlimited ad-free access to the largest independent learning library in tech. Access this title and thousands more!
Product feature icon 50+ new titles added per month, including many first-to-market concepts and exclusive early access to books as they are being written.
Product feature icon Innovative learning tools, including AI book assistants, code context explainers, and text-to-speech.
Product feature icon Thousands of reference materials covering every tech concept you need to stay up to date.
Subscribe now
View plans & pricing
Table of content icon View table of contents Preview book icon Preview Book

C++17 STL Cookbook

STL Containers

We will cover the following recipes in this chapter:

  • Using the erase-remove idiom on std::vector
  • Deleting items from an unsorted std::vector in O(1) time
  • Accessing std::vector instances the fast or the safe way
  • Keeping std::vector instances sorted
  • Inserting items efficiently and conditionally into std::map
  • Knowing the new insertion hint semantics of std::map::insert
  • Efficiently modifying the keys of std::map items
  • Using std::unordered_map with custom types
  • Filtering duplicates from user input and printing them in alphabetical order with std::set
  • Implementing a simple RPN calculator with std::stack
  • Implementing a word frequency counter with std::map
  • Implementing a writing style helper tool for finding very long sentences in texts with std::set
  • Implementing a personal to-do list using std::priority_queue

 

Introduction

The C++ standard library comes with a wide range of standard containers. A container always contains a collection of data or objects. The cool thing is that containers can be used with practically any kind of object, so we just need to pick the right containers for our specific application. The STL gives us stacks, automatically growing vectors, maps, and so on. This way we can concentrate on our app and don't need to reinvent the wheel. Knowing all containers well is therefore crucial for every C++ programmer.

All containers the STL provides can be categorized as follows, which is explained in detail in the subsequent subsection:

  • Contiguous storage
  • List storage
  • Search trees
  • Hash tables
  • Container adapters

Contiguous storage

...

Using the erase-remove idiom on std::vector

A lot of novice C++ programmers learn about std::vector, that it basically works like an automatically growing array, and stop right there. Later, they only lookup its documentation in order to see how to do very specific things, for example, removing items. Using STL containers like this will only scratch the surface of how much they help writing clean, maintainable, and fast code.

This section is all about removing items from in-between a vector instance. When an item disappears from a vector, and sits somewhere in the middle between other items, then all items right from it must move one slot to the left (which gives this task a runtime cost within O(n)). Many novice programmers will do that using a loop, since it is also not really a hard thing to do. Unfortunately, they will potentially ignore a lot...

Deleting items from an unsorted std::vector in O(1) time

Deleting items from somewhere in the middle of an std::vector takes O(n) time. This is because the resulting gap from removing an item must be filled by moving all the items which come after the gap one slot to the left.

While moving items around like this, which might be expensive if they are complex and/or very large and include many items, we preserve their order. If preserving the order is not important, we can optimize this, as this section shows.

How to do it...

In this section, we will fill an std::vector instance with some example numbers, and implement a quick remove function, which removes any item from a vector in O(1) time.

  1. First, we need to include...

Accessing std::vector instances the fast or the safe way

The std::vector is probably the most widely used container in the STL, because it holds data just like an array, and adds a lot of comfort around that representation. However, wrong access to a vector can still be dangerous. If a vector contains 100 elements, and by accident our code tries to access an element at index 123, this is obviously bad. Such a program could just crash, which might be the best case, because that behavior would make it very obvious that there is a bug! If it does not crash, we might observe that the program just behaves strangely from time to time, which could lead to even more headaches than a crashing program. The experienced programmer might add some checks before any directly indexed vector access. Such checks do not increase the readability of the code, and many people do not know that...

Keeping std::vector instances sorted

Arrays and vectors do not sort their payload objects themselves. But if we need that, this does not mean that we always have to switch to data structures, which were designed to do that automatically. If an std::vector is perfect for our use case, it is still very simple and practical to add items to it in a sorting manner.

How to do it...

In this section, we will fill an std::vector with random words, sort it, and then insert more words while keeping the vector's sorted word order intact.

  1. Let's first include all headers we're going to need.
      #include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include...

Inserting items efficiently and conditionally into std::map

Sometimes we want to fill a map with key-value pairs and while filling the map up, we might run into two different cases:

  1. The key does not exist yet. Create a fresh key-value pair.
  2. The key does exist already. Take the existing item and modify it.


We could just naively use the insert or emplace methods of map and see if they succeed. If it doesn't, we have case 2 and modify the existing item. In both cases, insert and emplace create the item which we try to insert, and in case 2 the freshly created item is dropped. We get a useless constructor call in both cases.

Since C++17, there is the try_emplace function, which enables us to create items only conditionally upon insertion. Let's implement a program that takes a list of billionaires and constructs a map that tells us the number of billionaires...

Introduction


The C++ standard library comes with a wide range of standard containers. A container always contains a collection of data or objects. The cool thing is that containers can be used with practically any kind of object, so we just need to pick the right containers for our specific application. The STL gives us stacks, automatically growing vectors, maps, and so on. This way we can concentrate on our app and don't need to reinvent the wheel. Knowing all containers well is therefore crucial for every C++ programmer.

All containers the STL provides can be categorized as follows, which is explained in detail in the subsequent subsection:

  • Contiguous storage
  • List storage
  • Search trees
  • Hash tables
  • Container adapters

Contiguous storage

The simplest way to store objects is to put them just next to each other in one large chunk of memory. Such memory can be accessed in a random access manner in O(1) time.

The easiest way to do that is using std::array, which is just a wrapper around normal C-style...

Using the erase-remove idiom on std::vector


A lot of novice C++ programmers learn about std::vector, that it basically works like an automatically growing array, and stop right there. Later, they only lookup its documentation in order to see how to do very specific things, for example, removing items. Using STL containers like this will only scratch the surface of how much they help writing clean, maintainable, and fast code.

 

This section is all about removing items from in-between a vector instance. When an item disappears from a vector, and sits somewhere in the middle between other items, then all items right from it must move one slot to the left (which gives this task a runtime cost within O(n)). Many novice programmers will do that using a loop, since it is also not really a hard thing to do. Unfortunately, they will potentially ignore a lot of optimization potential while doing that. And in the end, a hand crafted loop is neither faster, nor prettier to read than the STL way, which...

Deleting items from an unsorted std::vector in O(1) time


Deleting items from somewhere in the middle of an std::vector takes O(n) time. This is because the resulting gap from removing an item must be filled by moving all the items which come after the gap one slot to the left.

While moving items around like this, which might be expensive if they are complex and/or very large and include many items, we preserve their order. If preserving the order is not important, we can optimize this, as this section shows.

How to do it...

In this section, we will fill an std::vector instance with some example numbers, and implement a quick remove function, which removes any item from a vector in O(1) time.

  1. First, we need to include the required header files.
      #include <iostream>
      #include <vector>
      #include <algorithm>
  1. Then, we define a main function where we instantiate a vector with example numbers.
      int main()
      {
          std::vector<int> v {123, 456, 789,...

Accessing std::vector instances the fast or the safe way


The std::vector is probably the most widely used container in the STL, because it holds data just like an array, and adds a lot of comfort around that representation. However, wrong access to a vector can still be dangerous. If a vector contains 100 elements, and by accident our code tries to access an element at index 123, this is obviously bad. Such a program could just crash, which might be the best case, because that behavior would make it very obvious that there is a bug! If it does not crash, we might observe that the program just behaves strangely from time to time, which could lead to even more headaches than a crashing program. The experienced programmer might add some checks before any directly indexed vector access. Such checks do not increase the readability of the code, and many people do not know that std::vector already has built-in bound checks!

How to do it...

In this section, we will use the two different ways to access...

Keeping std::vector instances sorted


Arrays and vectors do not sort their payload objects themselves. But if we need that, this does not mean that we always have to switch to data structures, which were designed to do that automatically. If an std::vector is perfect for our use case, it is still very simple and practical to add items to it in a sorting manner.

How to do it...

In this section, we will fill an std::vector with random words, sort it, and then insert more words while keeping the vector's sorted word order intact.

  1. Let's first include all headers we're going to need.
      #include <iostream>
      #include <vector>
      #include <string>
      #include <algorithm>
      #include <iterator> 
      #include <cassert>

 

  1. We also declare that we are using namespace std in order to spare us some std:: prefixes:
      using namespace std;
  1. Then we write a little main function, which fills a vector with some random strings.
      int main()
      {
       ...

Inserting items efficiently and conditionally into std::map


Sometimes we want to fill a map with key-value pairs and while filling the map up, we might run into two different cases:

  1. The key does not exist yet. Create a fresh key-value pair.
  2. The key does exist already. Take the existing item and modify it.

We could just naively use the insert or emplace methods of map and see if they succeed. If it doesn't, we have case 2 and modify the existing item. In both cases, insert and emplace create the item which we try to insert, and in case 2 the freshly created item is dropped. We get a useless constructor call in both cases.

Since C++17, there is the try_emplace function, which enables us to create items only conditionally upon insertion. Let's implement a program that takes a list of billionaires and constructs a map that tells us the number of billionaires per country. In addition to that, it stores the wealthiest person in every country. Our example will not contain expensive to create items...

Knowing the new insertion hint semantics of std::map::insert


Looking up items in an std::map takes O(log(n)) time. This is the same for inserting new items, because the position where to insert them must be looked up. Naive insertion of M new items would thus take O(M * log(n)) time.

In order to make this more efficient, std::map insertion functions accept an optional insertion hint parameter. The insertion hint is basically an iterator, which points near the future position of the item that is to be inserted. If the hint is correct, then we get amortizedO(1) insertion time.

How to do it...

In this section, we will insert multiple items into an std::map, and use insertion hints for that, in order to reduce the number of lookups.

  1. We are mapping strings to numbers, so we need the header files included for std::map and std::string.
      #include <iostream>
      #include <map>
      #include <string>
  1. The next step is to instantiate a map, which already contains some example characters...

Efficiently modifying the keys of std::map items


Since the std::map data structure maps from keys to values in a way that the keys are always unique and sorted, it is of crucial value that users cannot modify the keys of map nodes that are already inserted. In order to prevent the user from modifying the key items of perfectly sorted map nodes, the const qualifier is added to the key type.

This kind of restriction is perfectly sane because it makes it harder for the user to use std::map the wrong way. But what shall we do if we really need to change the keys of some map items?

Prior to C++17, we had to remove the items of which we need to change the key value from the tree, in order to reinsert them. The downside of this approach is that this always needlessly reallocates some memory, which sounds bad in terms of performance.

Since C++17, we can remove and reinsert map nodes without any reallocation of memory. We will see how that works in this recipe. 

 

How to do it...

We implement a little...

Left arrow icon Right arrow icon

Key benefits

  • Learn the latest features of C++ and how to write better code by using the Standard Library (STL). Reduce the development time for your applications.
  • Understand the scope and power of STL features to deal with real-world problems.
  • Compose your own algorithms without forfeiting the simplicity and elegance of the STL way.

Description

C++ has come a long way and is in use in every area of the industry. Fast, efficient, and flexible, it is used to solve many problems. The upcoming version of C++ will see programmers change the way they code. If you want to grasp the practical usefulness of the C++17 STL in order to write smarter, fully portable code, then this book is for you. Beginning with new language features, this book will help you understand the language’s mechanics and library features, and offers insight into how they work. Unlike other books, ours takes an implementation-specific, problem-solution approach that will help you quickly overcome hurdles. You will learn the core STL concepts, such as containers, algorithms, utility classes, lambda expressions, iterators, and more, while working on practical real-world recipes. These recipes will help you get the most from the STL and show you how to program in a better way. By the end of the book, you will be up to date with the latest C++17 features and save time and effort while solving tasks elegantly using the STL.

Who is this book for?

This book is for intermediate-to-advanced C++ programmers who want to get the most out of the Standard Template Library of the newest version of C++: C++ 17.

What you will learn

  • Learn about the new core language features and the problems they were intended to solve
  • Understand the inner workings and requirements of iterators by implementing them
  • Explore algorithms, functional programming style, and lambda expressions
  • Leverage the rich, portable, fast, and well-tested set of well-designed algorithms provided in the STL
  • Work with strings the STL way instead of handcrafting C-style code
  • Understand standard support classes for concurrency and synchronization, and how to put them to work
  • Use the filesystem library addition available with the C++17 STL

Product Details

Country selected
Publication date, Length, Edition, Language, ISBN-13
Publication date : Jun 28, 2017
Length: 532 pages
Edition : 1st
Language : English
ISBN-13 : 9781787120495
Category :
Languages :
Tools :

What do you get with a Packt Subscription?

Free for first 7 days. $19.99 p/m after that. Cancel any time!
Product feature icon Unlimited ad-free access to the largest independent learning library in tech. Access this title and thousands more!
Product feature icon 50+ new titles added per month, including many first-to-market concepts and exclusive early access to books as they are being written.
Product feature icon Innovative learning tools, including AI book assistants, code context explainers, and text-to-speech.
Product feature icon Thousands of reference materials covering every tech concept you need to stay up to date.
Subscribe now
View plans & pricing

Product Details

Publication date : Jun 28, 2017
Length: 532 pages
Edition : 1st
Language : English
ISBN-13 : 9781787120495
Category :
Languages :
Tools :

Packt Subscriptions

See our plans and pricing
Modal Close icon
$19.99 billed monthly
Feature tick icon Unlimited access to Packt's library of 7,000+ practical books and videos
Feature tick icon Constantly refreshed with 50+ new titles a month
Feature tick icon Exclusive Early access to books as they're written
Feature tick icon Solve problems while you work with advanced search and reference features
Feature tick icon Offline reading on the mobile app
Feature tick icon Simple pricing, no contract
$199.99 billed annually
Feature tick icon Unlimited access to Packt's library of 7,000+ practical books and videos
Feature tick icon Constantly refreshed with 50+ new titles a month
Feature tick icon Exclusive Early access to books as they're written
Feature tick icon Solve problems while you work with advanced search and reference features
Feature tick icon Offline reading on the mobile app
Feature tick icon Choose a DRM-free eBook or Video every month to keep
Feature tick icon PLUS own as many other DRM-free eBooks or Videos as you like for just $5 each
Feature tick icon Exclusive print discounts
$279.99 billed in 18 months
Feature tick icon Unlimited access to Packt's library of 7,000+ practical books and videos
Feature tick icon Constantly refreshed with 50+ new titles a month
Feature tick icon Exclusive Early access to books as they're written
Feature tick icon Solve problems while you work with advanced search and reference features
Feature tick icon Offline reading on the mobile app
Feature tick icon Choose a DRM-free eBook or Video every month to keep
Feature tick icon PLUS own as many other DRM-free eBooks or Videos as you like for just $5 each
Feature tick icon Exclusive print discounts

Frequently bought together


Stars icon
Total $ 158.97
Modern C++ Programming Cookbook
$54.99
C++17 STL Cookbook
$54.99
Mastering C++ Multithreading
$48.99
Total $ 158.97 Stars icon

Table of Contents

10 Chapters
The New C++17 Features Chevron down icon Chevron up icon
STL Containers Chevron down icon Chevron up icon
Iterators Chevron down icon Chevron up icon
Lambda Expressions Chevron down icon Chevron up icon
STL Algorithm Basics Chevron down icon Chevron up icon
Advanced Use of STL Algorithms Chevron down icon Chevron up icon
Strings, Stream Classes, and Regular Expressions Chevron down icon Chevron up icon
Utility Classes Chevron down icon Chevron up icon
Parallelism and Concurrency Chevron down icon Chevron up icon
Filesystem Chevron down icon Chevron up icon

Customer reviews

Top Reviews
Rating distribution
Full star icon Full star icon Full star icon Full star icon Half star icon 4.3
(15 Ratings)
5 star 53.3%
4 star 33.3%
3 star 6.7%
2 star 6.7%
1 star 0%
Filter icon Filter
Top Reviews

Filter reviews by




thierry Mar 31, 2018
Full star icon Full star icon Full star icon Full star icon Full star icon 5
Ce livre et le code source l'accompagnant est à ma connaissance celui qui décrit le mieux les différences de syntaxe entre les différentes versions du C++ et ce jusqu'à la version C++17 sur le STL bien entendu.Il est essentiellement tourné vers la pratique --> how to ..A vous développeur de faire le reste !
Amazon Verified review Amazon
Edgar Aroutiounian Jun 10, 2018
Full star icon Full star icon Full star icon Full star icon Full star icon 5
In terms of being a cookbook, then it serves its purpose well but it completely breaks down mid way through on the kindle edition on web. About midway through the pages become one column chars, which is ridiculously broken. Author should have tested this, so its kinda useless to me now. Please fix.EDIT: Kindle App on mac works fine and this is a great cookbook.
Amazon Verified review Amazon
Bartek F. Aug 30, 2017
Full star icon Full star icon Full star icon Full star icon Full star icon 5
Another solid book about C++17 just before the C++17 Standard is announced!Pros:- Practical, full of examples, demos, little utilities- Details of the approach, even with pictures and diagrams! :)- Cookbook style, read what you want- Shows how to make code compact- Shows how to use STL as building block for an app/problem- Focuses on modern C++, avoids using raw code style: pointers, C-style arrays, even raw loops- Introduces functional conceptsCons: Nitpicking: some samples might not work yet if your compiler is not in the C++ latest mode, or even experimental (will change soon).Not aimed at beginners, but if you have some experience with C++, you'll find something for yourself. The chapters are structured to be as clear as possible, with introductions and even pictures and diagrams.
Amazon Verified review Amazon
Tadas Nov 06, 2017
Full star icon Full star icon Full star icon Full star icon Full star icon 5
Very detailed book. I'm not saying it has all what you need in your life, but it is full of information.
Amazon Verified review Amazon
pat26 Feb 08, 2020
Full star icon Full star icon Full star icon Full star icon Full star icon 5
The authors provides easy to understand examples. If you have been programming in c++ for awhile, his comparison of C++17 features with older C++ versions, will be very helpful.
Amazon Verified review Amazon
Get free access to Packt library with over 7500+ books and video courses for 7 days!
Start Free Trial

FAQs

What is included in a Packt subscription? Chevron down icon Chevron up icon

A subscription provides you with full access to view all Packt and licnesed content online, this includes exclusive access to Early Access titles. Depending on the tier chosen you can also earn credits and discounts to use for owning content

How can I cancel my subscription? Chevron down icon Chevron up icon

To cancel your subscription with us simply go to the account page - found in the top right of the page or at https://subscription.packtpub.com/my-account/subscription - From here you will see the ‘cancel subscription’ button in the grey box with your subscription information in.

What are credits? Chevron down icon Chevron up icon

Credits can be earned from reading 40 section of any title within the payment cycle - a month starting from the day of subscription payment. You also earn a Credit every month if you subscribe to our annual or 18 month plans. Credits can be used to buy books DRM free, the same way that you would pay for a book. Your credits can be found in the subscription homepage - subscription.packtpub.com - clicking on ‘the my’ library dropdown and selecting ‘credits’.

What happens if an Early Access Course is cancelled? Chevron down icon Chevron up icon

Projects are rarely cancelled, but sometimes it's unavoidable. If an Early Access course is cancelled or excessively delayed, you can exchange your purchase for another course. For further details, please contact us here.

Where can I send feedback about an Early Access title? Chevron down icon Chevron up icon

If you have any feedback about the product you're reading, or Early Access in general, then please fill out a contact form here and we'll make sure the feedback gets to the right team. 

Can I download the code files for Early Access titles? Chevron down icon Chevron up icon

We try to ensure that all books in Early Access have code available to use, download, and fork on GitHub. This helps us be more agile in the development of the book, and helps keep the often changing code base of new versions and new technologies as up to date as possible. Unfortunately, however, there will be rare cases when it is not possible for us to have downloadable code samples available until publication.

When we publish the book, the code files will also be available to download from the Packt website.

How accurate is the publication date? Chevron down icon Chevron up icon

The publication date is as accurate as we can be at any point in the project. Unfortunately, delays can happen. Often those delays are out of our control, such as changes to the technology code base or delays in the tech release. We do our best to give you an accurate estimate of the publication date at any given time, and as more chapters are delivered, the more accurate the delivery date will become.

How will I know when new chapters are ready? Chevron down icon Chevron up icon

We'll let you know every time there has been an update to a course that you've bought in Early Access. You'll get an email to let you know there has been a new chapter, or a change to a previous chapter. The new chapters are automatically added to your account, so you can also check back there any time you're ready and download or read them online.

I am a Packt subscriber, do I get Early Access? Chevron down icon Chevron up icon

Yes, all Early Access content is fully available through your subscription. You will need to have a paid for or active trial subscription in order to access all titles.

How is Early Access delivered? Chevron down icon Chevron up icon

Early Access is currently only available as a PDF or through our online reader. As we make changes or add new chapters, the files in your Packt account will be updated so you can download them again or view them online immediately.

How do I buy Early Access content? Chevron down icon Chevron up icon

Early Access is a way of us getting our content to you quicker, but the method of buying the Early Access course is still the same. Just find the course you want to buy, go through the check-out steps, and you’ll get a confirmation email from us with information and a link to the relevant Early Access courses.

What is Early Access? Chevron down icon Chevron up icon

Keeping up to date with the latest technology is difficult; new versions, new frameworks, new techniques. This feature gives you a head-start to our content, as it's being created. With Early Access you'll receive each chapter as it's written, and get regular updates throughout the product's development, as well as the final course as soon as it's ready.We created Early Access as a means of giving you the information you need, as soon as it's available. As we go through the process of developing a course, 99% of it can be ready but we can't publish until that last 1% falls in to place. Early Access helps to unlock the potential of our content early, to help you start your learning when you need it most. You not only get access to every chapter as it's delivered, edited, and updated, but you'll also get the finalized, DRM-free product to download in any format you want when it's published. As a member of Packt, you'll also be eligible for our exclusive offers, including a free course every day, and discounts on new and popular titles.