C++ Tutorial Index

C++ Tutorial C++ History C++ Installation C++ First Program C++ cin and cout C++ Data type C++ Variable C++ operator C++ Keywords

C++ Control Statements

C++ If C++ Nested if C++ If-else C++ If-else-if C++ Switch C++ Break C++ Continue C++ Goto C++ For loop C++ While loop C++ Do while loop

C++ Functions

C++ Call by Value C++ Call by Reference C++ Recursion Function C++ Inline function C++ Friend function

C++ Arrays

Single dimension array Two dimension array

C++ Strings

C++ Strings

C++ Inheritance

C++ Inheritance Single level Inheritance Multilevel Inheritance Multiple Inheritance Hierarchical Inheritance Hybrid Inheritance

C++ Polymorphism

C++ Polymorphism C++ Overloading C++ Overriding C++ Virtual Function

C++ Pointers

C++ Pointers C++ this pointer

C++ Exception Handling

C++ Exception Handling

C++ Constructors

C++ Constructors Default Constructor Parameterize Constructor Copy constructor Constructor Overloading Destructor

C++ File Handling

C++ File Handling C++ Writing to file C++ Reading file C++ Close file

Miscellaneous

C Vs C++ C++ Comments C++ Data Abstraction C++ Identifier C++ Memory Management C++ Storage Classes C++ Void Pointer C++ Array To Function C++ Expressions C++ Features C++ Interfaces C++ Encapsulation std::min in C++ External merge sort in C++ Remove duplicates from sorted array in C++ Precision of floating point numbers Using these functions floor(), ceil(), trunc(), round() and setprecision() in C++ C++ References C++ Friend Functions C++ Mutable keyword Unary Operators in C++ Initialize Array of objects with parameterized constructors in C++ Differences between #define & const in C/C++ C++ Program to Implement Shell Sort C++ Program to Implement Merge Sort Storage Classes in C Vector resize() in C++ Passing by Reference Vs. Passing by the pointer in C++ Free vs delete() in C++ goto statement in C and C++ C++ program to read string using cin.getline() C++ String Concatenation Heap Sort in C++ Swap numbers in C++ Input Iterators in C++ Fibonacci Series in C++ C ++ Program: Alphabet Triangle and Number Triangle C++ Program: Matrix Multiplication C++ Program to Print Fibonacci Triangle Stack in C++ Maps in C++ Queue in C++ C++ Bitset C++ Algorithms Priority Queue in C++ C++ Multimap C++ Deque Function Pointer in C++ Sizeof() Operators in C++ C++ array of Pointers free() Vs delete in C Timsort Implementation Using C++ CPP Templates C++ Aggregation C++ Enumeration C++ Math Functions C++ Object Class C++ Queue Initialize Vector in C++ Vector in C++ C++ STL Components Function overloading in C++ C++ Maximum Index Problem C++ find missing in the second array C++ Program to find the product array puzzle C++ Program To Find Largest Subarray With 0 Sum C++ Program To Move All Zeros To The End Of The Array C++ Program to find the element that occurs once C++ Program to find the largest number formed from an array Constructor Vs Destructor C++ Namespaces C++ OOPs Concept C++ Static C++ Structs C++ Try-Catch C++ User Defined Exceptions C++ Virtual Destructor C++ vs C# Malloc() and new in C++ Palindrome Number Program in C++ Snake Code in C++ Splitting a string in C++ Structure Vs Class in C++ Virtual Function Vs Pure Virtual Function C++ Bidirectional Iterators C++ Forward Iterators C++ Iterators C++ Output Iterators C++ Range-based For Loop Converting string into integer in C++ LCM Program in C++ Type conversion in C++ Add two numbers using the function in C++ Advantage and disadvantage friend function C++ Armstrong Number Program in C++ ATM machine program in C++ using functions Binary to Decimal in C++ Bit Manipulation in C++ C++ Constructor C++ Dijkstra Algorithm Using the Priority Queue C++ int into String C++ Signal Handling Decimal to Binary in C++ Decimal to Hexadecimal in C++ Decimal to Octal in C++ Factorial Program in C++ Function in C++ Hexadecimal to Decimal in C++ Octal to Decimal in C++ Reverse a Number in C++ Structure Vs Class in C++ C++ Forward Iterators C++ Output Iterators C++ Prime number program Char Array to String in C++ Constructor Overloading in C++ Default arguments in C++ Different Ways to Compare Strings in C++ Dynamic Binding in C++ Program to convert infix to postfix expression in C++ SET Data Structure in C++ Upcasting and Downcasting in C++ Reverse an Array in C++ Fast Input and Output in C++ Delete Operator in C++ Copy elision in C++ C++ Date and Time C++ Bitwise XOR Operator Array of sets in C++ Binary Operator Overloading in C++ Binary Search in C++ Implementing the sets without C++ STL containers Scope Resolution Operator in C++ Smart pointers in C++ Types of polymorphism in C++ Exception Handling in C++ vs Java Const Keyword in C++ Type Casting in C++ Static keyword in C++ vs Java Inheritance in C++ vs Java How to concatenate two strings in C++ Programs to Print Pyramid Patterns in C++ swap() function in C++ Structure of C++ Program Stringstream in C++ and its applications rand() and srand() in C / C++ C++ Ternary Operator C++ Scope of Variables While Loop Examples in C++ Star pattern in C++ using For Loops For Loop Examples in C++ Do-While Loop Examples in C++ Top 5 IDEs for C++ That You Should Try Once Assertions in C/C++ C++ Convert Int to String Continue in C++ While loop Diamond Pattern in C++ using For Loop How to Reverse a String in C++ using Do-While Loop How to Reverse a String in C++ using For Loop How to Reverse a String in C++ using While Loop Infinite loop in C++ Loops in C++ Returning Multiple Values from a Function using Tuple and Pair in C++ wcscpy(), wcslen(), wcscmp() Functions in C++ Auto keyword in C++ C++ 11 vs C++ 14 vs C++ 17 C++ STL (Standard Template Library) Differences Between C Structures and C++ Structures Divide by Zero Exception in C++ Dynamic Constructor in C++ Dynamic Memory Allocation in C++ Find the Size of Array in C/C++ without using sizeof() function Floating Point Operations and Associativity in C, C++ and Java Hello World Program in C++ How to create a table in C++ How to Setup Environment for C++ Programming on Mac Implementation of a Falling Matrix in C++ Message Passing in C++ Pointer to Object in C++ Templates in C++ vs Generics in Java Ways to Copy a Vector in C++ What does Buffer Flush mean in C++ sort() function in C++ Structure Sorting (By Multiple Rules) in C++ Similarities between C++ and Java std::distance in C++ Array program in C++ C++ Tricks for Competitive Programming Desired Capabilities in Selenium Web Driver in C++ Socket Programming in C++ Template Specialization in C++ Classes and Objects in C++ Convex hull Algorithm in C++ DES in C++ C++ vardiac() function Difference between Two Sets in C++ Difference between Exit and Return Structured Binding in C++ Differences between Local and Global Variable Bitwise Operator vs Logical Operator Difference between OOP and POP in C++ Fork in C++ Functors in C++ How to call a void function in C++ How to create a directory or folder in C/C++ How to create a library in C++ How to create a stack in C++ How to create the Processes with Fork in C++ How to Handle Divide by Zero Exception in C++ Lambda Expression in C++ Pattern programs in C++ Roadmap to C++ Programming Substring in C++ Virtual base class in C++ Bits stdc++.h in C++ Top 14 Best Free C++ IDE (Editor & Compiler) for Windows in 2022 Bitmasking in C++ Auto Keyword in C++ Features of OOPS in C++ Hospital Management Project in C++ How to Declare Unordered Sets in C++ How to Sort an Array in C++ Include Guards in C++ Iostream in C++ Method overriding in C++ How to run program in turbo c++ How to Use Getline in C++ Leap Year Program in C++ Naming Convention in C++ New Operator in C++ Nullptr in C++ Object Slicing in C++ Principles of Object-Oriented Programming in C++ Processing strings using std string stream in C++ Pure Virtual Function in C++ With Example Program Random Number Generator in C++ Singleton Design Pattern in C++ Size_t Data Type in C++ Skyline Problem in C++ System() function in C++ Web Development in C++ Data Hiding in C++ Difference between exit() and _Exit() in C++ Hashing in C++ Object in C++ Sum of all Elements between k1’th and k2’th Smallest Elements Virtual class in C++ Vector Size in C++ Top best IDEs for C/C++ Developers in 2022 Tensorflow in C++ Sliding Window Technique in C++ Reverse String Word-Wise in C++ Returning a Function Pointer from a Function in C/C++ RTTI in C++ Pthreads or POSIX Threads in C++ Reserved Keywords in C++ Passing a Vector to a function in C++ 10 Best C and C++ Books for Beginners & Advanced Programmers Add two numbers represented by two arrays in C++ Array of Object in C++ C++ Program For FCFS Containership in C++ Counting Frequencies of Array Elements in C++ Decltype type Specifier in C++ Dynamic _Cast in C++ Difference between int main() and int main(void) in C/C++ Depth First Search Program to Traverse a Graph in C++ Features and Use Of Pointers in C/C++ Fread Function in C++ Programming Fscanf Function in The C++ Functions in C++ With Types and Examples Gmtime Function in C/C++ How is Multiset Implemented in C++ How to Build a Program in C++ How to Declare a 2d Array Dynamically in C++ inheritance Program in C++ int Max and int Min in C/C++ is It Fine to Write Void Main Or Main in C/C++ How to create a button in C++ abs() function in C++ Compile Time Polymorphism in C++ Division in C++ Factorial of a Number in C++ using while Loop Multiset in C++ 4 Pillars of OOPs Approach in C++ Backtracking Time Complexity in C++ C++ Global Variable C++ Pipe Tutorial Observer Design Pattern in C++ Private Inheritance in C++ Pthread in C++ Parameters SDL library in C++ with Examples Pointers in C++ Ascending order in C++ How the value is passed in C++ Call by Pointer in C++ Constexpr in C++ Deadlock in C++ Design Patterns in C++ Factory Method for Designing Pattern in C++ How to calculate size of string in C++ Name Mangling and extern in C++ Preventing Object Copy in C++ Program that produces different results in C and C++ Quick Sort in C++ Single Handling in C++ Type difference of Character literals in C VS C++ Use of Inheritance in C++ User-defined literals in C++ Vector methods in C++ Void * in C and C++ Zombie and Orphan Process in C++ Isprint() in C++ List and Vector in C++ List iterators in C++ Merging Two Vectors in C++ Sleep function in C++ Stoi function in C++ String erase() in C++ String Trim in C++ When should we write own Assignment operator in C++ C++ tcp client server example C++ tcp server example Early Binding and Late Binding in C++ Factory Design Pattern in C++ Fisher-Yates shuffle algorithm in C++ For Auto in C++ Group anagrams in C++ How to convert binary string to int in C++ How to convert string to float in C++ How to remove space from string in C++ How to use pair in C++ How to use the string find() in C++ Dynamic Casting in C++ 2D Vector Initialization in C++ C++ GUI Visual Studio C++ IPC C++ Macro Function Example C++ Permutation Overloading Stream Insertion in C++ Overloading array Index operator in C++ Operators that cannot be overloaded in C++ Operator overloading in C++ isprint() function in c++ Is_trivial function in C++ Is assignment operator Inherited in C++ div() function in C++ Default Assignment Operator and References in C++ Copy Constructor vs Assignment Operator in C++ Conversion Operator in C++ Array sum in C++ STL C++ Define Macro C++ Design C++ Factory Pattern TCP Client Server Example in C++ Convert String to Uppercase in C++ exit() and _Exit() in C and C++ Initializer list in C++ Iterator invalidation in C++ Lower bound in C++ Modulus of Two float numbers or double number Pass by value in C++ Set insert function in C++ Std partition_point in C++ Unary Operator Overloading in C++ Using Default Arguments with Virtual Functions Virtual Functions and Runtime Polymorphism What is endl in C++ What is Unary Operator Overloading in C++ Which operators cannot be overloaded in C++? rint(), rintf(), rintl() in C++ Stack size in C++ String append() function in C++ String push_back() in C++ String replace() in C++ Transform function in C++ Unique in C++ Unordered_map in C++ Binary String to Int C++ Boost C++ ctime() function in C++ Difference Between Overloading and Overriding in C++ Exception handling in constructor and destructor in C++ Explain class template in C++ Fesetround() and Fegetround() in C++ and their application Gets() and Puts() in C++ Hypot(), hypotf() and hypotl() in C++ Kadane Algorithm in C++ Log function in C++ Map of Pairs in STL Map vs unordered_map in C++ Nearbyint() Function in C++ Pair in C++ Access Specifiers in C++ Add Two Numbers in C++ Using Class Benefits of Operator Overloading in C++ C++ Socket Programming Windows C++ Program for Addition of Two Numbers Using Functions C++ Programming Examples C++ Protected Inheritance C++ Return Object Static Data Members in C++ Program for COPY Constructor in C++ Association in C++ C_str in C++ Boost libraries in C++ C++ macro function Assignment Operator Overloading in C++ Automatic Storage Class in C++ Function Object in C++ C++ Move Constructor Cast in C++ C++ 11 Lambda C++ Multithreading Bottom-up Approach in C++ C++ Program to Divide the String Into N equal Parts Gray Code to Binary Code in C++ How to get the value of pi in C++ Multimap value_comp() function in C++ Vector of Vectors in C++ Naïve Bayes Algorithm in C++ f 10 C++ Programming Tricks You Should Know btowc() function in C++ forward_list::cend() in C++ Unordered_multimap max_load_factor() function in C++ Cpp_int in c++ Dynamic Objects in C++ FLOCK() FUNCTION IN C++ Generate Random Double Numbers in C++ How to Assign Infinity to a Number in C++ Jump statements in C++ Multipath inheritance in C++ Out of Range Exception in C++ Size of Class in C++ Size of string in C++ std::binary_negate in c++ Thread_local in C++ Tokenizing a String in C++ Ancestors of a Node in Binary Search Tree C++ program for Double to String Conversion C++ Program to Demonstrate Use of Formatting Flags on Float Output Clamp in C++ K-Dimensional Tree in C++ Mutable Lambda in C++ Power Set in C++ Program to Find Sum of Geometric Progression Std::Back_inserter in C++ Strpbrk() function in C++ Size of int in C++ TYPES OF MANIPULATORS IN C++ Double colon in C++ How to sort vector in C++ How to use Setprecision in C++ How to write a Vector in C++ Insertion in Splay Tree in C++ Merge Sort Algorithm in C++ Printing a Character using ASCII value in C++ Regex in C++ Size of Data Types in C++ Abstract Factory Design Pattern in C++ Sqrtf() function in C++ Static Casting in C++ Using Range in Switch Case in C++ wcstoimax() and wcstoumax() function in C++ What is float in C++ What is the Diamond Problem in C++ Best way to learn C++ ios setstate() function in C++ Nested Namespace in C++ Single Inheritance in C++ std::fixed, std::scientific, std::hexfloat, std::defaultfloat in C++ StringStream in C++ for Decimal to Hexadecimal and back The OFFSETOF() macro in C++ Semaphores in C++ Seekg in C++ stacktrace Header file in C++ 23 std::future in C++ std::unary_negate() in C++ Difference between std::endl and \n in C++ Iswspace Function in C++ Difference between std-next and std::advance in C++ Hiding of all overloaded methods with same name in base class in C++ C++ program to concatenate two strings using operator overloading Difference between array::fill() and array::swap() in C++ Difference between Friend Function and Virtual Function in C++ Semaphores in C++ UDP server- client implementattion in C++ What is long long in C++ CSV file management using C++ fma() function in C++ Toggle bits of a number except first and last bits in C++ Trailing Return Type C++ 11 Binary search implementation in C++ Different Versions of C++ What is Cascading in C++ Background Colour in C++ BOOL DATATYPE IN C++ BIT VECTORS IN C++ Literals in C++ Application of pointer in C++ Index with minimum sum of prefix and suffix sums in an array in C++ Maximum sum Bi-tonic sub-sequence in C++ std::optional in C++ C/C++ program for triangular matchstick number COUT COMMAND IN C++ LANGUAGE Adjacency matrix program in C++ language Exception Objects in C++ Difference between Null String and Empty String in C++ Character data type in c++ Constructors in Inheritance C++ Comma Operator Overloading in C++ Typename in C++ C++ Friend Class C++ Exceptions Difference Between C and C++ Double-linked list program in C++ Color Code in C++ CRC Program in C++ Anti-Clockwise spiral traversal of a binary tree in C++ Advantages of OOP in C++ Cryptarithmetic Puzzle in C++ Angular sweep algorithm in C++ Factorial of Large Numbers in C++ endl Function in C++ vfprintf() method in C++ Check if a given number is Pronic in C++ Difference between Fundamental Data Type and Derived Data Types in C++ Different Ways to initialize an unordered_set in C++ Dinic’s Algorithm in C++ How to read whole ASCII File into C++ using std::string? std::unary_negate() in C++ String::npos function in C++ type_traits::is_null_pointer in C++ C++ code to count the local extrema of given array Demlo number (square of 11....1) in C++ Function Template and Class Template in C++ Getline in C++ GUI Design in C++ Hashing Implementation in C++ HIERARCHICAL INHERITANCE IN C++ Hospital Management System in C++ How to Add Header Files in Dev C++? How to cin string in C++ How to compile a C++ program in Visual Studio code Iscntrl in C++ Memento Pattern in C++ Smarandache-Wellin Sequence in C++ The feclearexcept in C++ HashMap in C++ Alexander Bogomolny's UnOrdered Permutation Algorithm in C++ Convex Polygon in C++ Count Univalue Subtrees in C++ Entringer Number in C++ Friends pairing Problem in C++ Klee's Algorithm (Length of the union of segments of a line) in C++ Spaceship Operator(&|t;==>) in C++ Uniform Initialization in C++ Woodall Number in C++ C++ Program to Solve Knapsack Problem Using Dynamic Programming How do you exit from the infinite loop in Turbo C++? How to create a game using C++ language How to do XOR in C++? How to Find Max Value in Array C++ How to get date in C++ Pointer to a Derived Class in C++ C++ program to show runtime exceptions Convert a Singly LinkedList to XOR LinkedList in C++ Creation of Variable in C++ CRTP (curiously recurring template pattern) in C++ Euler Circuits in Directed Graphs Using C++ Final NBA Match pairing in C++ Find pivot in rotated sorted array in C++ How to make a square in C++ How to reduce fractions in C++ std::lerp in C++ Stella Octangula Numbers in C++ Return Statement in C++ Finding the n-th Fortune Number in C++ How to use StringStream in C++ Minimize Count of Unequal Elements at corresponding Indices between give n arrays in C++ std::midpoint in C++ std::transform inclusive scan in C++ std::span in C++ Types of Errors in C++ C++ program to implement the bin packing algorithm Dereference Operator in C++ How to merge multiple std::sets into a single std::set in C++? Stack Clear C++ Structure and Class in C++ Template Definition in C++ Tree Data Structure in C++ Typename in C++ Program in C++ for Beginners Restoring a Shuffled Queue in C++ Print patterns in C++ Hybrid Inheritance in C++ How to use OpenGL in C++? How to Separate a String in C++ Havel-Hakimi algorithm in C++ Find the size of all connected Non-Empty Cells of a Matrix in C++ Burst Sort Algorithm in C++ Basic istream peak() method in C++ Addition of two matrices in C++ What is std reference wrapper in C++? What is std mbrtoc 32 in C++? What is std istreambuf iterator in C++? What is std declval in C++? std rethrow if nested in C++ std regex search in C++ std ctype byname in C++ std call once in C++ std basic ios copyfmt in C++ std atomic ref in C++ Properties of Friend Function in C++ Sophie Germain Prime number in C++ Centroid Decomposition in C++ How to Get the List of All Running Tasks in C++ Programming Questions on Function Overloading in C++ std codecvt in and std codecvt do in in C++ std is constant evaluated in C++ Std put money in C++ Number of ordered pairs such that Ai Aj = 0 in C++ dlsym() function in C++ Isxdigit() function in C++ Difference between Objective C and C++ Menu Driven Program in C++ Undulating Numbers in C++ How to Access Private Variables in C++? Particle Swarm Optimization in C++ Understanding std::ios_base::iword in C++ std::piecewise_construct _t in C++ Toeplitz Matrix in C++ Two-Way Linear Search Algorithm in C++ C++ Concurrency in action C++ integer size C++ Enum class Compare two lists in C++ Command to run C++ Program in terminal Cascading In C++ Static Member Function in C++ with Example C++ Multiple, Multilevel and Hierarchical inheritance Painting Fence Algorithm in C++ Rearrange Distant Barcodes in C++ What are the rules for using an Underscore in a C++ dentifier? std::quoted in C++ Std::memory_order in C++ Std::fisher_f_distribution in C++ Advantages Oops in C++ floor() and ceil() function in C++ Topological Sort in C++ How to get file size in C++ Class Meaning in C++ DIFFERENCE BETWEEN NEW AND DELETE OPERATOR IN C++ New and Delete In C++ Operators in C++ String data types in C++ begin() in C++ Static Library Linking in C++ Stack Unwinding in C++ Singleton Pattern in C++ Shared_ptr in C++ Random Number between 1 and 10 in C++ Initializer in C++ Error Handling in C++ Define Reference in C++ Create a Class in C++ C++ Move Semantics What is Thread Id to Int in C++? What is a Static Member Function in C++? Using Keyword in C++ C++ IDE Linux C++ Mini Project With Source Code and Output All swing components C++ Syntax Link Call By Value And Call By Reference In C++ Const ptr c++ Const_cast C++ Constant Arguments in C++ Example of parameterized constructor in C++ example of user-defined data type Anonymous object in C++ Bank program in C++ Base class and Derived class in C++ Cerr in C++ Cin string in C++ cin.get() in C++ Containers in C++ Control flow statement in C++ coroutine in C++ cstdlib in C++ Difference between encapsulation and Abstraction Difference between template and macro in C++ Emplace_back in C++ Cstdio in C++ Exception specification in C++ Files and streams in C++ Hamming code implementation in C++ Map cbegin() and cend() function in C++ STL Map Emplace_hint() function in C++ STL Naked function calls in C++ Private destructor in C++ Static object in C++ unordered_set in C++ Uses of namespace std in C++ Virtual function and virtual base class in C++ VS Code Setup for C++ Vtable and vptr in C++ fixed() function in C++ How to remove an element from an array in C++ How to take space-separated input in C++ iomanip in C++ Isdigit() function in C++ noexcept in C++ rdbuf() in c++ seekg() function in C++ Seekp() function in C++ Setw() in C++ The diamond pattern in C++ Advantages and Disadvantages of Inheritance in C++ C++ Variables Types Explain Access Specifiers in C++ Anagram Program in C++ AREA OF TRIANGLE IN C++ ARRAY INPUT IN C++ Big Integers in C++ Bitwise Operator in C++ Data Structures Algorithms and Application in C++ EOF Function in C++ Explicit in C++ File Opening Mode in C++ Friend Function in C++ Function Overriding in C++ How to Copy in Turbo C++? How To Use POW in C++ Increment Operator in C++ Inline Functions in C++ Int range in C++ Integer in C++ Linked List in C++ malloc() and calloc() in C++ Maximum Value in Vector in C++ NPTEL Programming in C++ Assignment Solutions SHARED POINTER IN C++ Vector in C++ Stl What is an Object in C++ What is Copy Constructor in C++ Dereferencing a Pointer in C++ fill() Function in C++ map find() function in C++ Associative Containers In C++ C++ generic programming introduction Character Set in C++ Class and Structure in C++ Decltype in c++ Difference Between Abstraction and Interface in C++ File Stream in C++ Final in C++ Final Keyword in C++ Find substring in C++ Flush in C++ Has-A Relationship in C++ How to allocate memory dynamically in C++ How to close turbo C++ in windows 10 How to Use Modulus in C++ How to use Set in C++ Input and Output Operators in C++ Insert Function in C++ MENU DRIVEN PROGRAM IN C++ MOVE SEMANTICS IN C++ OOPs Interview Questions in C++ PARAMETER PASSING IN C++ PUNCTUATORS IN C++ SPLIT FUNCTION IN C++ Stream Classes in C++ Vector declaration in c++ Vector in C++ Virtual Function in C++ Binary Search Tree Program in C++ Built-in Types in C++ API in C++ Returning Object from a Function in C++ C++ Singleton C++ Template Class Declaration and Definition Tree in C++ C++ Type Traits Catch All Exceptions in C++ Lvalue and Rvalue in C++ Move Constructor in C++ Move Semantics in C++ Mutex Lock in C++ Qt in C++ Tutorial STL Algorithms in C++ Access Class members in C++ Designated initializers in C++ Dynamic Initialization of Objects in C++ Inbuilt Functions in C++ Metaclass in C++ Nesting of a member function in C++ Unique_ptr() in C++ Vector erase() function in C++ Vector insert() Function in C++ 10 important concepts of Oops in C++ At in C++ Difference Between Abstraction and Encapsulation in C++ Difference between Function Overloading and Operator Overloading in C++ Exception Specifications in C++ Examples of Destructor in C++ Examples of Hybrid Inheritance in C++ How to declare an Array in C++ How to declare string in C++ Instance variable in C++ Manipulators in C++ Pointer Declaration in C++ preprocessor in C++ Push_Back() Function in C++ Space in C++ String stl in c++ Edmonds Karp algorithm in C++ How to Create Singleton Class in C++ Static Polymorphism in C++ Associative Containers In C++ C++ generic programming introduction Character Set in C++ Class and Structure in C++ Decltype in c++ Difference Between Abstraction and Interface in C++ File Stream in C++ Final in C++ Final Keyword in C++ Find substring in C++ Flush in C++ Has-A Relationship in C++ How to allocate memory dynamically in C++ How to close turbo C++ in windows 10 How to Use Modulus in C++ How to use Set in C++ Input and Output Operators in C++ Insert Function in C++ MENU DRIVEN PROGRAM IN C++ MOVE SEMANTICS IN C++ OOPs Interview Questions in C++ PARAMETER PASSING IN C++ PUNCTUATORS IN C++ SPLIT FUNCTION IN C++ Stream Classes in C++ Vector declaration in c++ Vector in C++ Virtual Function in C++ Associative Containers In C++ C++ generic programming introduction Character Set in C++ Class and Structure in C++ Decltype in c++ Difference Between Abstraction and Interface in C++ File Stream in C++ Final in C++ Final Keyword in C++ Find substring in C++ Flush in C++ Has-A Relationship in C++ How to allocate memory dynamically in C++ How to close turbo C++ in windows 10 How to Use Modulus in C++ How to use Set in C++ Input and Output Operators in C++ Insert Function in C++ MENU DRIVEN PROGRAM IN C++ MOVE SEMANTICS IN C++ OOPs Interview Questions in C++ PARAMETER PASSING IN C++ PUNCTUATORS IN C++ SPLIT FUNCTION IN C++ Stream Classes in C++ Vector declaration in c++ Virtual Function in C++ Babylonian Square Root Algorithm in C++ C++ Delegates Complex Number Program in C++ Custom Sort in C++ Differences Between C++ and JavaScript Meta Classes in C++ Prim’s Algorithm in C++ RAII in C++ How to access set elements in C++ How to Allocate and Deallocate Memory in C++ How to Convert String to Lowercase in c++ How to initialize a string in C++ How to Input a String in C++ Ignore Function in C++ Image Recognition Algorithm in C++ Insertion Sort Algorithm in C++ Knapsack Problem in C++ LOG BASE 2 IN C++ LOOPING STATEMENT IN C++ Managing Output with Manipulators in C++ Max Heap in C++ mbrlen- function in C-C++ Merge Overlapping Intervals in C++ Merge Sort Recursive in C++ Methods to Sort Strings in C++ Multiline Comment in C++ Multiple catch statements in C++ Naïve Bayes Algorithm in C++ Needleman Wunsch Algorithm in C++ Object delegation in C++ Pass 2 Assembler Program in C++ ratio_less_equal() function in C++ Rethrowing an exception in C++ Return type in C++ Reusability in C++ Round Robin Scheduling Program in C++ Sequence Container in C++ Sieve of Eratosthenes in C++ SOLID PRINCIPLES IN C++ STACK USING PUSH POP PROGRAMME IN C++ Stdlib Header File in C++ Strcmp function in C++ strcmpi in C++ Find minimum s-t cut in a flow network in C++ Hamilton Cycle Detection in C++ list cbеgin() and cеnd() function in C++ Maximum Bipartite Matching in C++ Neural Network in C++ Otsu Thresholding Opencv C++ Pancake Sorting in C++ Pimpl Idiom in C++ Print All Interleavings of Given Two Strings in C++ Print the Corner Elements and their Sum in a 2-D Matrix in C++ reinterpret_cast in C++ Rotate Bits of a Number in C++ Shallow Copy in C++ Stable Marriage Program in C++ Stack Smashing Detected in C++ Static Data Member in C++ String::npos in C++ Thread safe queue in C++ Total Keywords in C++ Tug of War in C++ What Kind of Exceptions are Available in C++ Which Operator is Used to Allocate Memory for an Object Boundary Traversal of Binary Number in C++ Difference between POP and OOP in C++ Fundamentals of Data Structures in C++ C++ Constructor Return Type C++ Libraries C++ STL Tutorial C++ Throw Character String in C++ Clone a Linked List with Next and Random Pointer in C++ Counting Sort in C++ Diffеrеncе Bеtwееn dеquе::cbеgin and dеquе::assign in C++ Difference between Null and Nullptr in C++ Facade Pattern in C++ Semaphore in C++ Accumulate function in C++ Algorithm Header File in C++ Applications of C++ basic_istream::putback() in C++ Benefits of OOPs Boost library in C++ Bubble Sort in C++ C++ Override C++ Struct Public Throw Exception in C++ Call by Rеfеrеncе in C++ Character in C++ Characteristics of friend function in C++ Cin Getline in C++ Collections in C++ Composition in c++ Continue Statement in C++ Developing a Digital Synthesizer in C++ Different C++ Versions Diffеrеncе Bеtwееn Friеnd Function and Virtual Function in C++ Find a triplet from three linked lists with a sum equal to a given number in C++ Fizz Buzz Problem in C++ Forward list in C++ Friend Function and Friend Class in C++ Advantages of Function Overloading in C++ Game Library for C++ HashSet in C++ Heapify Algorithm in C++ Hopcroft Karp algorithm in C++ String find function in C++ Tellg in C++ The lower_bound in C++ The sum of digits in C++ Thinking in C++ language THIS FUNCTION IN C++ Tower of Hanoi Algorithm in C++ Transpose of a Matrix in C++ language Types of Execution in C++ Use of explicit keyword in C++ User-defined header files in C++ Vector of String in C++ Virtual Table in C++ Visibility Mode in C++ What are Literals in C++ What are manipulators in C++ Abstract Data Type in C++ POP full form in C++ 8-puzzle Problem Using Branch and Bound in C++ BK tree in C++ Decorator pattern in C++ Fusion tree in C++ Jump Pointer algorithm in C++ std::remove_extent in C++ Tabu search in C++ Nested structure in C++

Containers in C++

In this article, we will discuss the containers in C++ with their types, examples, and outputs.

An element collection can be stored and arranged using a data structure called a container in C++. In the Standard Library, C++ offers many container classes, each with a different set of features and functions intended to fulfill a certain function.

Container types in C++:

  1. Sequence Containers
  2. Associative Containers
  3. Unordered Associative Containers
  4. Container Adapters

An overview of the major container categories and the container classes that correspond with them is provided below:

1. Sequence Containers

    The ability to store elements that can be accessed in a sequential order is made possible by sequential containers in C++. Arrays or linked lists are the internal data structures used to implement sequential containers.

    Sequential Container Types:

    There are various types of sequential containers. These are as follows:

    • Vector
    • Array
    • Deque
    • List
    • Forward List

    a) Vector: The containers for arrays that can alter in size are called vectors. Similar to arrays, the elements of vectors are stored in contiguous memory regions. In contrast to arrays, a vector's size can vary dynamically, and the container will take care of any storage needs.

    Example:

    #include <iostream>

        #include <vector>

        using namespace std;

        int main()

        {

            vector<int> vec;

            for (int i = 1; i <= 30; i = i * 4)

                vec.push_back(i);

            cout << "Output with vec.begin() and vec.end(): ";

            for (auto i = vec.begin(); i != vec.end(); i++)

                cout << *i << " ";

            cout << "\nOutput with vec.rbegin() and vec.rend(): ";

            for (auto ir = vec.rbegin(); ir != vec.rend(); ir++)

                cout << *ir << " ";

            return 0;

        }

    Output:

    Output with vec.begin() and vec.end(): 1 4 16

    Output with vec.rbegin() and vec.rend(): 16 4 1

    Explanation:

    In this example, we create a vector vec. The push_back() function was used to add elements to this vector. After that, we utilized the begin() and end(), rbegin(), and rend() methods to print the vector in a left-to-right or right-to-left direction, respectively.

    b) Array: Array is a fixed-size array whose size is known at compile time. Containers with a set size are called arrays. A certain amount of elements are contained in them. Instead of having to go through the entire array, we can use array elements directly by specifying their index.

    Example:

    #include <iostream>

        #include <array>

        using namespace std;

        int main()

        {

            //Creating an array

            array<int, 5> arr = {10, 18, 15, 12, 13,};

            // constructing an array iterator

            array<int, 5>::iterator it;

            // using the iterator to iterate through each entry of the array

            cout << "The array is: ";

            for(it = arr.begin(); it < arr.end(); it++)

            {

                cout << *it << " ";

            }

            cout << endl;

            cout << "The size of the array is: " << arr.size() << endl;

            return 0;

        }

    Output:

    The array is: 10 18 15 12 13

    The size of the array is: 5

    Explanation:

    The program above generated an array called arr using the array standard library. Afterward, we made use of a variety of array library's preset functions. The pointers indicate the array's start and last entries that the methods begin() and end() respectively return. Size() provides the array's size as a result.

    c) Deque: A double-ended queue that effectively accommodates inserting and removing items from both ends. The double-ended queue is abbreviated as DEQUE. The size of a deque is a container that can change dynamically on both ends. Deque enables us to access each of its parts using random access iterators.

    Example:

    #include <iostream>

        #include <deque>

        using namespace std;

        int main()

        {

            deque<int> dq;

            dq.push_back(8);   // added element at the back

            dq.push_front(6);  // added element at the front

            dq.push_back(3);   // added element at the back

            dq.push_front(2);  // added element at the front

            deque<int>::iterator it;

            cout << "The deque dq is: ";

            for (it = dq.begin(); it != dq.end(); it++)

            {         

                cout << *it << " ";

            }

            cout << "\ndq.size(): " << dq.size();

            // removing the first element of a deque

            dq.pop_front();

            cout << "\nDeque after using pop_front() is: ";

            for (it = dq.begin(); it != dq.end(); it++)

            {         

                cout << *it << " ";

            }

            return 0;

        }

    Output:

    The deque dq is: 2 6 8 3

    dq.size(): 4

    Deque after using pop_front() is: 6 8 3

    Explanation:

    A deque dq was produced in the example above. Using the push_back() and push_front() functions, we correspondingly added components to the back and front of the deque. After that, we used the size() method to determine the size of the deque. Finally, we used the pop_front() function to remove the deque's first element.

    d) List: A doubly-linked list that facilitates quick insertion and removal at any point. Lists are sequence containers that enable insert and erase operations in constant time, wherever in a sequence they are allowed, just like forward lists. A doubly-linked list is how lists are implemented. In light of this, iteration is possible in both directions (front and back).

    Example:

    #include <iostream>

        #include <iterator>

        #include <list>

        using namespace std;

        int main()

        {

            //Defining a list

            list<int> lst;

            //Defining an iterator

            list<int>::iterator it;

            for (int i = 0; i < 7; i++)

            {

                // including a back element

                lst.push_back(i * 5);

            }

            // printing the list

            cout << "List (lst) is -> ";

            for (it = lst.begin(); it != lst.end(); ++it)

            {

                cout << *it << " ";

            }

            cout << endl;

            // the list's first and last elements are printed

            cout << "lst.front() -> " << lst.front() << endl;

            cout << "lst.back() -> " << lst.back() << endl;

            // reversing the list

            lst.reverse();

            cout << "lst.reverse() -> ";

            for (it = lst.begin(); it != lst.end(); ++it)

            {

                cout << *it << " ";

            }

            return 0;

        }

    Output:

    List (lst) is -> 0 5 10 15 20 25 30

    lst.front() -> 0

    lst.back() -> 30

    lst.reverse() -> 30 25 20 15 10 5 0

    Explanation:

    The push_back() function was used to add elements to the list lst that was formed in the aforementioned example. After that, the front() and back() procedures were used to print the list's first and last entries. Finally, the list was reversed using the reverse() function.

    e) Forward List: Forward lists are sequence containers that enable insert and erase operations in constant time, regardless of where in the sequence they occur. Singly-linked lists implement the forward lists. As a result, each element of a forward list can be kept in a different location in memory.

    Example:

    #include <iostream>

        #include <forward_list>

        using namespace std;

        int main()

        {

            //Creating a forward list

            forward_list<int> fr_lst = {61, 12, 35, 24, 52};

            // using push_front() to inserted new values

            fr_lst.push_front(8);

            fr_lst.push_front(10);

            // printing the forward list

            cout << "The forward list is: ";

            for (int& i : fr_lst)

            {

                cout << i << " ";

            }

            cout << endl;

            // Using pop_front(), delete the first value

            fr_lst.pop_front();

            // printing the revised forward list

            cout << "Forward list after using pop_front: ";

            for (int& i : fr_lst)

            {

                cout << i << " ";

            }

            return 0;

        }

    Output:

    The forward list is: 10 8 61 12 35 24 52

    Forward list after using pop_front: 8 61 12 35 24 52

    Explanation:

    In this example, the forward list fr_lst was made, and five additional members were added to it. After that, we utilized the push_front() function to add two more members to the list. Finally, the pop_front() function was used to eliminate the list's first element.

    2. Associative Containers

    Associative containers are ones in which an element's position is determined by its value. The position of an element is determined without taking the sequence of the elements' insertion into account. Keys, sometimes known as search keys, are used to access the contents of an associative container.

    The four different types of associative containers

    • Set
    • Map
    • Multiset
    • Multimap
    • Set

    a) set is a collection of items, each of which (or each key) must be distinct. It is impossible to change an element once it has been added to a set. However, the element can be taken out of the set. They are stored in a sorted manner to ensure quick storage and retrieval of the items in a set.

    Example:

    #include <iostream>

        #include <set>

        using namespace std;

        int main()

        {

            // declaring a set container empty

            set<int> s1;

            // declaring an iterator

            set<int>::iterator it;

            // The components should be inserted randomly

            s1.insert(34);

            s1.insert(53);

            s1.insert(26);

            s1.insert(50);

            // A second attempt to add 50 to the set

            s1.insert(50);

            // printing set s1

            cout << "The set s1 is -> ";

            for (it = s1.begin(); it != s1.end(); it++)

            {

                cout << *it << " ";

            }

            cout << endl << endl;

            // Delete the element in S1 with the value 50.

            s1.erase(50);

            cout << "Set s1 after using s1.erase(50) -> ";

            for (it = s1.begin(); it != s1.end(); it++)

            {

                cout << *it << " ";

            }

            return 0;

    }

    Output:

    The set s1 is -> 26 34 50 53

    Set s1 after using s1.erase(50) -> 26 34 53

    Explanation:

    In this example, the number 50 was attempted to be inserted twice. In contrast, 50 was only added once to the set because every element in a set must be distinct. After that, an element was eliminated from the set by using the erase() function.

    b) Map

    Key-value pairs are the unit of storage for data in a map. A map container must have just one value assigned to each key, and all of the keys must be distinct. Both the key's associated value and its data type could be different. The components of a map are kept about the key. Any position in a map container can have items added to it or taken away.

    Example:

    #include <iostream>

        #include <map>

        using namespace std;

        int main()

        {

            // declaring an empty map container

            map<int, char> m1;

            map<int, char>::iterator itr;

            // insert elements

            m1.insert(pair<int, char>(1, 'e'));

            m1.insert(pair<int, char>(3, 'd'));

            m1.insert(pair<int, char>(4, 'c'));

            m1.insert(pair<int, char>(5, 'g'));

            m1.insert(pair<int, char>(2, 'y'));

            // printing map gquiz1

    cout<< "The map m1 is: " <<endl;

    cout<< "KEY  ->  VALUE" <<endl;

            for (itr = m1.begin(); itr != m1.end(); ++itr)

            {

    cout<<"  "<<itr->first << "  ->  "

    <<itr->second <<endl;

            }

    cout<<endl;

            // removeing the element with key = 4

            m1.erase(4);

    cout<< "Map after executing m1.erase(4) is: " <<endl;

    cout<< "KEY  ->  VALUE" <<endl;

            for (itr = m1.begin(); itr != m1.end(); ++itr)

            {

    cout<<"  "<<itr->first << "  ->  "

    <<itr->second <<endl;

            }

            return 0;

        }

    Output:

    The map m1 is:

    KEY  ->  VALUE

    1  ->  e

    2  ->  y

    3  ->  d

    4  ->  c

    5  ->  g

    Map after executing m1.erase(4) is:

    KEY  ->  VALUE

    1  ->  e

    2  ->  y

    3  ->  d

    5  ->  g

    Explanation:

    In the example above, we established a map and added elements with the help of the insert() function. After that, the element with key = 4 was eliminated using the erase() function.

    c) Multiset

    In contrast to sets, multisets are containers that permit the duplication of elements (keys). An element's value cannot be changed once it has been stored in a multiset, but it can be taken out of the container.

    Example:

    #include <iostream>

        #include <set>

        using namespace std;

        int main()

        {

            // empty multiset container

            multiset<int> ms1;

            // insert elements in random order

            ms1.insert(40);

            ms1.insert(60);

            ms1.insert(10);

            ms1.insert(20);

            // 50 will be added twice to the set

            ms1.insert(50);

            // printing multiset ms1

            multiset<int>::iterator itr;

    cout<< "The multiset ms1 is: " <<endl;

            for (itr = ms1.begin(); itr != ms1.end(); itr++)

            {

    cout<< *itr<< " ";

            }

    cout<<endl<<endl;

            //Remove all elements up to the element with the value 40 in ms1

    cout<< "ms1 after removal of elements < 40: " <<endl;

            ms1.erase(ms1.begin(), ms1.find(40));

            for (itr = ms1.begin(); itr != ms1.end(); itr++)

            {

    cout<< *itr<< " ";

            }

            return 0;

        }

    Output:

    The multiset ms1 is:

    10 20 40 50 60

    ms1 after removal of elements < 40:

    40 50 60

    d) Multimap

    Map containers and multimap containers are similar. However, the latter allows the storage of duplicate keys. So, the key-value pairs have a one-to-many relationship with one another. The data type of a key in a multimap can vary from that of the value it corresponds to.

    Example:

    #include <iostream>

        #include <map>

        using namespace std;

        int main()

        {

            // empty multimap container

            multimap<int, int> m1;

            multimap<int, int>::iterator itr;

            // insert elements

            m1.insert(pair<int, int>(43, 2));

            m1.insert(pair<int, int>(30, 3));

            m1.insert(pair<int, int>(38, 4));

            m1.insert(pair<int, int>(24, 7));

            m1.insert(pair<int, int>(45, 8));

            // printing multimap m1

    cout<< "The multimap m1 is: " <<endl;

    cout<< "KEY  ->  VALUE" <<endl;

            for (itr = m1.begin(); itr != m1.end(); itr++)

            {

    cout<< " " <<itr->first <<"  ->  "

    <<itr->second <<endl;

            }

    cout<<endl;

            // removing all elements up to key with value 30

            m1.erase(m1.begin(), m1.find(30));

    cout<< "m1 after removal of elements < key = 30: " <<endl;

    cout<< "KEY  ->  VALUE" <<endl;

            for (itr = m1.begin(); itr != m1.end(); itr++)

            {

    cout<< " " <<itr->first <<"  ->  "

    <<itr->second <<endl;

            }

            return 0;

        }

    Output:

    The multimap m1 is:

    KEY  ->  VALUE

    24  ->  7

    30  ->  3

    38  ->  4

    43  ->  2

    45  ->  8

    m1 after removal of elements < key = 30:

    KEY  ->  VALUE

    30  ->  3

    38  ->  4

    43  ->  2

    45  ->  8

    Explanation:

    In this example, we constructed a multimap. Here, we were able to insert the same key into the multimap twice because the multimap allows for duplicate key values. We also utilized the erase() function to eliminate all the entries with key values lower than 30.

    3. Unordered Associative Containers

    Unordered containers are those containers where the placement of the items is irrelevant, also known as unordered associative containers. Unordered containers do not store items by the values they contain or the order in which they were inserted. The positional order of n elements in an unordered container is ill-defined and may even fluctuate over time. These containers' elements can be reached via a hash(#).

    In the C++ STL, there are four varieties of unordered containers:

    • Unordered_set
    • Unordered_multiset
    • Unordered_map
    • Unordered_multimap

    a) Unordered_set

    Unordered sets serve as storage spaces for distinct pieces that aren't organized in any specific way. An element's key alone serves as its value in an unordered set. Although they can be added and removed, an unordered set's elements cannot be changed.

    Example:

    #include <iostream>

    #include <unordered_set>

     using namespace std;

     int main()

     {

            // declaring unordered set

            unordered_set <char> set1 ;

            // declaring an iterator

            unordered_set<char> :: iterator itr;

            // inserting elements to the set

            set1.insert('s');

            set1.insert('e');

            set1.insert('r');

            set1.insert('w');

            set1.insert('t');

            set1.insert('y');

            // finding letter 's' in the set

            char key_to_find = 's' ;

            if (set1.find(key_to_find) == set1.end())

            {

                cout << "The key '" << key_to_find

    << "' is not present in set1" << endl << endl ;

            }

            else

            {

                cout << "The key '" << key_to_find

    << "' is present in set1" << endl << endl ;

            }

            // finding letter 'o' in the set

            key_to_find = 'o';

            if (set1.find(key_to_find) == set1.end())

            {

                cout << "The key '" << key_to_find

    << "' is not present in set1" << endl << endl ;

            }

            else

            {

                cout << "The key '" << key_to_find

    << "' is present in set1" << endl << endl ;

            }

            // printing all elements of the unordered set

            cout << "All elements of the unordered set: " << endl;

            for (itr = set1.begin(); itr != set1.end(); itr++)

            {

                cout << (*itr) << endl;

            }

            return 0;

        }

    Output:

    The key 's' is present in set1

    The key 'o' is not present in set1

    All elements of the unordered set:

    y

    t

    w

    r

    e

    s

    Explanation:

    In the example above, we used the insert() function to add elements to the unordered set. The elements' and 'o' were checked to see if they were present in the unordered set using the find() function. We can see from this example that the order of the elements' insertion differs from the order in which they were printed. It indicates that the components of unordered sets are not kept in a set order.

    b) Unordered_multiset

    Unordered multisets and unordered sets are similar; the only distinction is that unordered multisets permit duplicate entries. The elements of an unordered multiset cannot be changed, much like in unordered sets. Only insertion and removal are possible.

    Example:

    #include <iostream>

    #include <unordered_set>

    #include <string>

    int main()

    {

        // Create an unordered_multiset to store integers

        std::unordered_multiset<int> numbers;

        // Insert elements into the unordered_multiset

        numbers.insert(10);

        numbers.insert(20);

        numbers.insert(30);

        numbers.insert(20);

        // Allow duplicates

        // Iterate and print the elements in the unordered_multiset

        std::cout << "Elements in the unordered_multiset: ";

        for (const auto& num: numbers)

        {

            std::cout << num << " ";

        }

        std::cout << std::endl;

        // Count the occurrences of a specific element

        int target = 20;

        int count = numbers.count(target);

        std::cout << "Occurrences of " << target << ": " << count << std::endl;

        // Erase a specific element

        numbers.erase(target);

        // Check if an element exists in the unordered_multiset

        if (numbers.find(target) != numbers.end())

        {

            std::cout << target << " is found in the unordered_multiset." << std::endl;

        }

        else

        {

            std::cout << target << " is not found in the unordered_multiset." << std::endl;

        }

        // Clear all elements from the unordered_multiset

        numbers.clear();

        // Check if the unordered_multiset is empty

        if (numbers.empty())

        {

            std::cout << "The unordered_multiset is empty." << std::endl;

        }

        else

        {

            std::cout << "The unordered_multiset is not empty." << std::endl;

        }

        return 0;

    }

    Output:

    Elements in the unordered_multiset: 30 20 20 10

    Occurrences of 20: 2

    20 is not found in the unordered_multiset.

    The unordered_multiset is empty.

    Explanation:

    In this example, the integers are stored in an unordered_multiset set called numbers. With the help of the insert function, we add numerous pieces to the multiset, including duplicates. After that, we go through it using a range-based for loop to print every element in the multiset.

    Next, using the count function, we count how many times a certain element (like 20) appears. We may also take a specific element out of the multiset by using the erase() function. We use the find function to see if a specific element is present in the multiset.

    After that, the multiset is empty once all of its items have been removed using the clear() function, and the empty() function is used to determine if it is.

    c) Unordered_map

    Unordered maps are those data structures that store items in key-value pairs with no regard to their order of occurrence. The key is used to uniquely identify each element in unordered maps. Each key in unordered maps must be distinct. The mapped value's data type may differ from the key's data type.

    Example:

    #include <iostream>

    #include <unordered_map>

    #include <string>

    int main()

    {

        // Create an unordered_map to store student names and their corresponding ages

        std::unordered_map<std::string, int> studentAges;

        // Insert key-value pairs into the unordered_map

        studentAges["Alice"] = 25;

        studentAges["Bob"] = 22;

        studentAges["Charlie"] = 27;

        studentAges["Bob"] = 23; // Update Bob's age

        // Iterate and print the key-value pairs in the unordered_map

        std::cout << "Student names and their ages: " << std::endl;

        for (const auto& pair : studentAges)

        {

            std::cout << pair.first << ": " << pair.second << std::endl;

        }

        // Find the age of a specific student

        std::string targetName = "Charlie";

        auto it = studentAges.find(targetName);

        if (it != studentAges.end())

        {

            std::cout << targetName << "'s age is " << it->second << std::endl;

        }

        else

        {

            std::cout << "Student not found." << std::endl;

        }

        // Check if a student exists in the unordered_map

        targetName = "Eve";

        if (studentAges.count(targetName) > 0)

        {

            std::cout << targetName << " is found in the unordered_map." << std::endl;

        }

        else

        {

            std::cout << targetName << " is not found in the unordered_map." << std::endl;

        }

        // Erase a student from the unordered_map

        targetName = "Bob";

        studentAges.erase(targetName);

        // Check if the unordered_map is empty

        if (studentAges.empty())

        {

            std::cout << "The unordered_map is empty." << std::endl;

        }

        else

        {

            std::cout << "The unordered_map is not empty." << std::endl;

        }

        return 0;

    }

    Output:

    Student names and their ages:

    Charlie: 27

    Bob: 23

    Alice: 25

    Charlie's age is 27

    Eve is not found in the unordered_map.

    The unordered_map is not empty.

    Explanation:

    In this example, we make an unordered_map called studentAges to hold the ages of the students, with their names serving as the keys (strings) and ages serving as the values (integers). Using the square bracket ([]) operator, we may add several key-value pairs to the unordered_map and update the value for a particular key.

    After that, we employ a range-based for loop to run through the unordered_map and output each key-value pair. Keep in mind that because the unordered_map is an unordered container, the order of the components is not guaranteed.

    The age of a particular student (for example, "Charlie") is then looked up using the search function. When a pupil is located, their age is printed. Additionally, we utilize the count function to determine whether a student with the name "Eve" or another similar name is present in the unordered_map.

    Next, after removing a student from the unordered_map using the erase() function, we use the empty() function to determine whether the unordered_map is empty.

    The unordered_map is helpful for applications where quick lookup times are crucial since it enables quick access to and retrieval of data based on their distinctive keys.

    d) Unordered_multimap

    The main distinction between unordered multimaps and unordered maps is that various items may have the same key in the latter. The mapped value(s) and the key's data type may differ.

    Example:

    #include <iostream>

    #include <unordered_map>

    #include <string>

    int main()

    {

        // Create an unordered_multimap to store courses and their corresponding students

        std::unordered_multimap<std::string, std::string> courseStudents;

        // Insert key-value pairs into the unordered_multimap

        courseStudents.insert({"Math", "Alice"});

        courseStudents.insert({"Math", "Bob"});

        courseStudents.insert({"Physics", "Charlie"});

        courseStudents.insert({"Math", "Eve"});

        courseStudents.insert({"Physics", "Bob"});

        // Iterate and print the key-value pairs in the unordered_multimap

        std::cout << "Courses and their students: " << std::endl;

        for (const auto& pair: courseStudents)

        {

            std::cout << pair.first << ": " << pair.second << std::endl;

        }

        // Find students for a specific course

        std::string targetCourse = "Math";

        auto range = courseStudents.equal_range(targetCourse);

        std::cout << "Students enrolled in " << targetCourse << ":" << std::endl;

        for (auto it = range.first; it != range.second; ++it)

        {

            std::cout << it->second << std::endl;

        }

        // Check if a course exists in the unordered_multimap

        targetCourse = "Chemistry";

        if (courseStudents.count(targetCourse) > 0)

        {

            std::cout << targetCourse << " is found in the unordered_multimap." << std::endl;

        }

        else

        {

            std::cout << targetCourse << " is not found in the unordered_multimap." << std::endl;

        }

        // Erase a course from the unordered_multimap

        targetCourse = "Physics";

        courseStudents.erase(targetCourse);

        // Check if the unordered_multimap is empty

        if (courseStudents.empty())

        {

            std::cout << "The unordered_multimap is empty." << std::endl;

        }

        else

        {

            std::cout << "The unordered_multimap is not empty." << std::endl;

        }

        return 0;

    }

    Output:

    Courses and their students:

    Physics: Charlie

    Physics: Bob

    Math: Alice

    Math: Eve

    Math: Bob

    Students enrolled in Math:

    Alice

    Eve

    Bob

    Chemistry is not found in the unordered_multimap.

    The unordered_multimap is not empty.

    Explanation:

    In this example, the mapping of courses to the appropriate students is stored in an unordered_multimap called courseStudents. The values are the names of the students enrolled in those courses, and the keys are the titles of the courses (also strings).

    Using the insert function, several key-value pairs are added to the unordered_multimap. We can associate several students with the same course because it is an unordered_multimap.

    After that, we use a range-based for loop to crawl through the unordered_multimap and output each key-value pair. Since the unordered_multimap is an unordered container, there is no guarantee as to the order of the components.

    Next, the equal_range function is used to locate all students registered in a certain course (for example, "Math"). We also employ the count function to determine whether a course with a specific name. For example, "Chemistry" exists in the unordered_multimap.

    The next step is to remove a course (and the students associated with it) from the unordered_multimap using the erase function. Using the empty function, we verify whether the unordered_multimap is empty.

    When you need to store several components with the same key but don't need the elements to be sorted according to their keys, the unordered_multimap can be helpful. It allows quick access to and retrieval of values based on their keys and is especially helpful for applications that need quick lookup speeds and can deal with duplication.

    4. Container Adapters

    The term "container adapters" refers to a group of classes in C++ that offer a particular interface for interacting with the container data structure. They serve as encapsulations for pre-existing container classes and limit the allowed operations to a predetermined set. The C++ Standard Library has three main container adapters, which are as follows:

    a) stack

      A stack is a Last-In-First-Out (LIFO) interface that is provided by the std::stack container adapter. The operations it exposes are push, pop, top, empty, and size. It uses an underlying container (by default, std::deque).

      b) queue

      First-In-First-Out (FIFO), or queue, the interface is provided by the std::queue container adapter. Push, pop, front, back, empty, and size operations are also supported, and it uses an underlying container (by default, std::deque).

      c) priority_queue

      A priority queue is provided by the std::priority_queue container adapter, where elements are sorted using a specified comparator function (by default, it uses the std::less comparator). Push, pop, top, empty, and size operations are supported, and it uses an underlying container (by default, std::vector).

      Using these container adapters is demonstrated in the following example:

      Example:

      #include <iostream>

      #include <stack>

      #include <queue>

      int main()

      {

          // Stack example

          std::stack<int> intStack;

          intStack.push(10);

          intStack.push(20);

          intStack.push(30);

          std::cout << "Top element of the stack: " << intStack.top() << std::endl;

          intStack.pop();

          std::cout << "After pop, top element of the stack: " << intStack.top() << std::endl;

          // Queue example

          std::queue<std::string> stringQueue;

          stringQueue.push("First");

          stringQueue.push("Second");

          stringQueue.push("Third");

          std::cout << "Front element of the queue: " << stringQueue.front() << std::endl;

          stringQueue.pop();

          std::cout << "After pop, front element of the queue: " << stringQueue.front() << std::endl;

          // Priority Queue (min-heap) example

          std::priority_queue<int, std::vector<int>, std::greater<int>> intPriorityQueue;

          intPriorityQueue.push(50);

          intPriorityQueue.push(20);

          intPriorityQueue.push(70);

          intPriorityQueue.push(10);

          std::cout << "Top element of the priority queue: " << intPriorityQueue.top() << std::endl;

          intPriorityQueue.pop();

          std::cout << "After pop, top element of the priority queue: " << intPriorityQueue.top() << std::endl;

          return 0;

      }

      Output:

      Top element of the stack: 30

      After pop, top element of the stack: 20

      Front element of the queue: First

      After pop, front element of the queue: Second

      Top element of the priority queue: 10

      After pop, top element of the priority queue: 20

      Explanation:

      In this example, we show how to use std::stack, std::queue, and std::priority_queue in their fundamental actions. We construct instances of each container adapter for push, pop, top, and front operations.