{"id":1321,"date":"2023-09-10T20:25:55","date_gmt":"2023-09-10T20:25:55","guid":{"rendered":"https:\/\/www.w3computing.com\/articles\/?p=1321"},"modified":"2023-09-10T20:26:00","modified_gmt":"2023-09-10T20:26:00","slug":"cpp-std-vector-from-basics-to-advanced","status":"publish","type":"post","link":"https:\/\/www.w3computing.com\/articles\/cpp-std-vector-from-basics-to-advanced\/","title":{"rendered":"C++ std::vector: From Basics to Advanced"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>std::vector<\/code> stands as one of the linchpins of the C++ Standard Library, offering both novices and experienced developers a dynamic array with the ability to automatically manage its size. At its core, <code>std::vector<\/code> provides a way to store elements, typically of the same type, in a contiguous block of memory. Unlike standard arrays in C++, where the size is determined at compile-time, the <code>std::vector<\/code>&#8216;s size can change during runtime, allowing for an adaptive and flexible data structure.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Brief overview of <code>std::vector<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine wanting the convenience of an array but without being shackled by its size limitations. This is where the <code>std::vector<\/code> shines. Unlike arrays, where the size is set during its declaration, vectors are dynamic. You can add or remove elements, and the vector will automatically adjust its size. This does not mean that vectors lack the benefits of arrays. In fact, vectors store their elements in contiguous memory locations, ensuring that array-style random access (using an index) is just as fast and convenient.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Behind the scenes, <code>std::vector<\/code> handles a lot of heavy lifting. It manages memory allocation and deallocation, ensuring efficient use of resources. When the existing capacity is exhausted and a new element is added, the vector reallocates its memory, usually doubling its current capacity, to accommodate the new elements. This intelligent memory management ensures that operations on a vector, like adding elements, are efficient in average-case scenarios.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Importance in C++ standard library<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>std::vector<\/code> is more than just a dynamic array; it&#8217;s a testament to the philosophy of C++ \u2013 granting power and flexibility without sacrificing performance. When C++ developers, especially those coming from a background in C, need a dynamic list, their go-to choice is often <code>std::vector<\/code>. This is not without reason:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Performance<\/strong>: With data stored in contiguous memory, cache locality is improved, which significantly boosts the performance in many scenarios. Iterating over a <code>std::vector<\/code> is usually faster than other containers like <code>std::list<\/code> or <code>std::deque<\/code> due to this.<\/li>\n\n\n\n<li><strong>Flexibility<\/strong>: The ability to resize, coupled with a rich set of member functions, makes it adaptable to a myriad of problems.<\/li>\n\n\n\n<li><strong>Memory Efficiency<\/strong>: While <code>std::vector<\/code> manages dynamic memory, it does so efficiently. Functions like <code>reserve()<\/code> and <code>shrink_to_fit()<\/code> give developers fine control over memory usage.<\/li>\n\n\n\n<li><strong>Integration with C Arrays<\/strong>: Since the elements of a <code>std::vector<\/code> are stored in contiguous memory, it&#8217;s straightforward to integrate them with legacy C code by using the <code>data()<\/code> member function.<\/li>\n\n\n\n<li><strong>Safety with RAII<\/strong>: Resource Acquisition Is Initialization (RAII) is a cornerstone of C++ programming. <code>std::vector<\/code>, like other C++ containers, follows this principle, ensuring that resources (like memory) are automatically managed, reducing chances of leaks or dangling references.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">In the grand tapestry of the C++ Standard Library, <code>std::vector<\/code> is emblematic of what modern C++ offers \u2013 a blending of performance, adaptability, and safety.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preliminaries<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before diving into the depths of <code>std::vector<\/code> and its functionalities, it&#8217;s crucial to set up our C++ environment correctly. Like any tool, the power of <code>std::vector<\/code> can only be unlocked if we integrate it properly into our codebase.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Header inclusion: <code>#include &lt;vector&gt;<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The very first step to utilize <code>std::vector<\/code> is to include its corresponding header file. Just as we include <code>&lt;iostream&gt;<\/code> for input-output operations or <code>&lt;algorithm&gt;<\/code> for a set of algorithmic functions, to bring the functionalities of <code>std::vector<\/code> into our code, we need:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;vector&gt;<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">By adding this line at the beginning of our source code (usually after other standard library headers), we make all the member functions and capabilities of <code>std::vector<\/code> accessible.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Namespace consideration: <code>using namespace std;<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">C++ namespaces are a way to encapsulate identifier names to avoid naming collisions. The C++ Standard Library places most of its identifiers, including <code>std::vector<\/code>, inside the <code>std<\/code> namespace.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When using <code>std::vector<\/code> or any other standard library components, we have two main options:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Explicit Namespace Usage<\/strong>: Every time we refer to <code>vector<\/code> or any other standard library entity, we prefix it with the <code>std::<\/code> qualifier.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; myVector;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Using Directive<\/strong>: By writing <code>using namespace std;<\/code> after our includes, we inform the compiler that we want to use everything inside the <code>std<\/code> namespace without the <code>std::<\/code> prefix.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">using<\/span> <span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-built_in\">std<\/span>;\r\n<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; myVector;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">However, it&#8217;s essential to be cautious with the <code>using namespace<\/code> directive, especially in header files or large projects. Pulling everything from a namespace, especially one as expansive as <code>std<\/code>, can lead to naming collisions and unexpected behavior. A safer, albeit more verbose, method is to use the <code>std::<\/code> qualifier explicitly or employ using declarations for specific entities:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">using<\/span> <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>;\r\n<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; myVector;  <span class=\"hljs-comment\">\/\/ Now this works without pulling in the entire `std` namespace.<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Deep Dive into <code>std::vector<\/code>&#8216;s Anatomy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The true strength of any data structure lies beneath its interface. Understanding the inner workings, the &#8220;anatomy&#8221; if you will, is key to exploiting its full potential. The <code>std::vector<\/code> is no exception. Let&#8217;s unpack the internal details of <code>std::vector<\/code> and see what makes it such a powerful and versatile tool.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Memory Layout: Dynamic Array, Contiguous Memory<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">At its heart, <code>std::vector<\/code> is a dynamic array. But what does that mean?<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Dynamic Nature<\/strong>: Unlike traditional arrays that have a fixed size once declared, the size of a <code>std::vector<\/code> can change during runtime. It achieves this dynamic resizing through memory allocations and deallocations. When you insert an element into a vector that&#8217;s already at its capacity, the vector will allocate a new, larger block of memory, move the existing elements to this new block, and then deallocate the old memory block.<\/li>\n\n\n\n<li><strong>Contiguous Memory<\/strong>: Despite its dynamic nature, <code>std::vector<\/code> ensures that its elements are stored in a contiguous block of memory, just like a traditional array. This contiguous layout is critical for several reasons:\n<ul class=\"wp-block-list\">\n<li><strong>Performance<\/strong>: Contiguous memory ensures that elements are cache-friendly, meaning that when one element is loaded into the CPU cache, its neighbors are likely loaded too, making iterations faster.<\/li>\n\n\n\n<li><strong>Direct Access<\/strong>: Just like arrays, the contiguous memory layout allows for direct access using an index, giving O(1) access time for any element.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Benefits Over Traditional Arrays<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Given its dynamic array nature, <code>std::vector<\/code> offers several advantages over traditional arrays:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Dynamic Resizing<\/strong>: As previously mentioned, a <code>std::vector<\/code> resizes itself as needed. This eliminates the guesswork and potential wastage associated with pre-defining an array size.<\/li>\n\n\n\n<li><strong>Safety Features<\/strong>: <code>std::vector<\/code> provides member functions like <code>at()<\/code>, which can check bounds and throw exceptions if an out-of-bounds access is attempted, offering an extra layer of safety over raw array access.<\/li>\n\n\n\n<li><strong>Rich Standard Library Integration<\/strong>: Being a part of the C++ Standard Library, <code>std::vector<\/code> comes integrated with a plethora of functions. Whether it&#8217;s sorting with <code>std::sort()<\/code> or searching with <code>std::find()<\/code>, vectors play well with the rest of the library, reducing the amount of boilerplate code you have to write.<\/li>\n\n\n\n<li><strong>Memory Management<\/strong>: While arrays demand manual memory management when dynamically allocated (using pointers and <code>new<\/code>\/<code>delete<\/code>), <code>std::vector<\/code> handles this automatically, reducing the risks of memory leaks or access to deallocated memory.<\/li>\n\n\n\n<li><strong>Insertions and Deletions<\/strong>: Inserting or removing elements in the middle of an array is cumbersome, requiring shifting of elements manually. In contrast, <code>std::vector<\/code> provides functions like <code>insert()<\/code> and <code>erase()<\/code> to manage this, simplifying code and reducing potential errors.<\/li>\n\n\n\n<li><strong>Flexibility with Data Types<\/strong>: Vectors can easily store complex data types, including user-defined objects, without the need for intricate pointer arithmetic or memory management.<\/li>\n\n\n\n<li><strong>RAII Principles<\/strong>: <code>std::vector<\/code>, like many C++ Standard Library containers, adheres to the RAII (Resource Acquisition Is Initialization) principle. This ensures that its memory gets deallocated when it goes out of scope, providing a deterministic behavior and reducing memory management errors.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><code>std::vector<\/code> combines the best aspects of arrays \u2014 speed, direct access, and cache-friendliness \u2014 with the power and flexibility of dynamic data structures. It abstracts away the challenges and pitfalls of manual memory management, allowing developers to focus on implementing logic and algorithms rather than being bogged down with low-level details.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Creating and Initializing <code>std::vector<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The versatility of <code>std::vector<\/code> is further manifested in the multitude of ways it can be initialized. Whether you start with an empty vector or one that&#8217;s pre-filled with data, there&#8217;s a method tailored to your needs. Let&#8217;s explore these methods with practical examples.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Default Initialization<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This creates an empty vector.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec1;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Initialization with Size<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This initializes the vector with a given size. All elements will have default values (which is 0 for fundamental data types like <code>int<\/code>).<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; <span class=\"hljs-title\">vec2<\/span><span class=\"hljs-params\">(<span class=\"hljs-number\">5<\/span>)<\/span><\/span>;  <span class=\"hljs-comment\">\/\/ Creates a vector of size 5 with all elements as 0<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Initialization with Size and Default Value<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This initializes the vector with a given size, and all elements will have a specified default value.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">std::vector&lt;int&gt; vec3(<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">42<\/span>);  <span class=\"hljs-comment\">\/\/ Creates a vector of size 5 with all elements as 42<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">List Initialization<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Introduced with C++11, list initialization (also known as uniform initialization) allows you to create a vector and initialize it with specific values.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec4 = {<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>};  <span class=\"hljs-comment\">\/\/ Vector with 5 elements: 1, 2, 3, 4, 5<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Alternatively, you can also use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec4{<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>};<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Initialization from Another Vector<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A vector can be initialized from another vector. This creates a new vector with the same elements as the original.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec5 = vec4;  <span class=\"hljs-comment\">\/\/ Creates a vector with elements 1, 2, 3, 4, 5<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Using <code>std::vector::assign()<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>assign()<\/code> method allows for multiple ways to initialize a vector:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Using a size and default value:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec6;\r\nvec6.assign(<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">10<\/span>);  <span class=\"hljs-comment\">\/\/ Initializes vec6 with 5 elements, all set to 10<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li>From another vector:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec7;\r\nvec7.assign(vec4.begin(), vec4.end());  <span class=\"hljs-comment\">\/\/ Initializes vec7 with the same elements as vec4<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li>Using list initialization:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec8;\r\nvec8.assign({<span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">20<\/span>, <span class=\"hljs-number\">30<\/span>, <span class=\"hljs-number\">40<\/span>, <span class=\"hljs-number\">50<\/span>});  <span class=\"hljs-comment\">\/\/ Initializes vec8 with elements 10, 20, 30, 40, 50<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Accessing Elements in <code>std::vector<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">One of the primary uses of a vector (or any container) is accessing its elements. <code>std::vector<\/code> provides several ways to achieve this, each with its benefits and considerations.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Using <code>operator[]<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is the most straightforward way to access elements in a vector. It provides direct access similar to arrays.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec = {<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>};\r\n<span class=\"hljs-keyword\">int<\/span> value = vec&#91;<span class=\"hljs-number\">2<\/span>];  <span class=\"hljs-comment\">\/\/ value will be 3<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Performance Considerations<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>operator[]<\/code> is very fast and offers O(1) access time.<\/li>\n\n\n\n<li>However, it doesn&#8217;t check for out-of-bounds errors. If you access an index that&#8217;s outside the vector&#8217;s size, it leads to undefined behavior.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Using <code>at()<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>at()<\/code> member function provides a safer way to access elements by checking the provided index against the vector&#8217;s size.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">int<\/span> value = vec.at(<span class=\"hljs-number\">2<\/span>);  <span class=\"hljs-comment\">\/\/ value will be 3<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Performance Considerations<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>at()<\/code> is slightly slower than <code>operator[]<\/code> because of the boundary check.<\/li>\n\n\n\n<li>If an out-of-bounds index is provided, it throws an <code>std::out_of_range<\/code> exception.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><code>front()<\/code> and <code>back()<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">These member functions provide direct access to the first and last elements of the vector, respectively.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">int<\/span> first = vec.front();  <span class=\"hljs-comment\">\/\/ first will be 1<\/span>\r\n<span class=\"hljs-keyword\">int<\/span> last = vec.back();    <span class=\"hljs-comment\">\/\/ last will be 5<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Performance Considerations<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Both <code>front()<\/code> and <code>back()<\/code> are O(1) operations.<\/li>\n\n\n\n<li>They do not have boundary checks. If the vector is empty and these functions are used, the behavior is undefined.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Using Iterators<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Iterators are powerful tools in C++ that allow generic access to elements in a container. They work with vectors just as they do with other containers.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;::iterator it = vec.begin();\r\n<span class=\"hljs-keyword\">int<\/span> firstValue = *it;  <span class=\"hljs-comment\">\/\/ Dereferencing the iterator gives the value, in this case, 1<\/span>\r\n\r\n<span class=\"hljs-comment\">\/\/ Iterating through the vector using iterators<\/span>\r\n<span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;::iterator itr = vec.begin(); itr != vec.end(); ++itr) {\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; *itr &lt;&lt; <span class=\"hljs-string\">\" \"<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For C++11 and above, you can use the auto keyword for a more concise syntax:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">auto<\/span> itr = vec.begin(); itr != vec.end(); ++itr) {\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; *itr &lt;&lt; <span class=\"hljs-string\">\" \"<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">And with C++11&#8217;s range-based for loops, the process is even more streamlined:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">auto<\/span>&amp; value : vec) {\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; value &lt;&lt; <span class=\"hljs-string\">\" \"<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Performance Considerations<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Iterators provide O(1) access to individual elements.<\/li>\n\n\n\n<li>Iterating through the entire vector using iterators is an O(n) operation.<\/li>\n\n\n\n<li>Iterators can become invalidated after certain operations on the vector, like <code>insert<\/code> or <code>erase<\/code>, so always ensure your iterators are valid before use.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Modifying <code>std::vector<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">As dynamic containers, vectors in C++ are designed to grow and shrink, offering several member functions to modify their content. Let&#8217;s explore some of these functionalities.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>push_back()<\/code> &amp; <code>pop_back()<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>push_back()<\/code> adds an element to the end of the vector, while <code>pop_back()<\/code> removes the last element.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec = {<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>};\r\n\r\nvec.push_back(<span class=\"hljs-number\">4<\/span>);    <span class=\"hljs-comment\">\/\/ vec: 1, 2, 3, 4<\/span>\r\nvec.pop_back();      <span class=\"hljs-comment\">\/\/ vec: 1, 2, 3<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><code>insert()<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This function allows adding elements in the middle of the vector.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>At a specific position<\/strong>:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">auto<\/span> it = vec.begin() + <span class=\"hljs-number\">1<\/span>;\r\nvec.insert(it, <span class=\"hljs-number\">42<\/span>);  <span class=\"hljs-comment\">\/\/ Insert 42 at the second position; vec: 1, 42, 2, 3<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Inserting <code>n<\/code> elements<\/strong>:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\">vec.insert(it, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">42<\/span>);  <span class=\"hljs-comment\">\/\/ Insert three 42s at the second position; vec: 1, 42, 42, 42, 2, 3<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>From another vector<\/strong>:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec2 = {<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">8<\/span>, <span class=\"hljs-number\">9<\/span>};\r\nvec.insert(vec.end(), vec2.begin(), vec2.end());  <span class=\"hljs-comment\">\/\/ Append vec2 to vec; vec: 1, 2, 3, 7, 8, 9<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><code>erase()<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This function removes elements from the vector.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Erase a single element<\/strong>:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">auto<\/span> it = vec.begin() + <span class=\"hljs-number\">2<\/span>;\r\nvec.erase(it);  <span class=\"hljs-comment\">\/\/ Removes the third element; assuming vec: 1, 2, 3, results in vec: 1, 2<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Erase a range of elements<\/strong>:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\">vec.erase(vec.begin() + <span class=\"hljs-number\">1<\/span>, vec.begin() + <span class=\"hljs-number\">3<\/span>);  <span class=\"hljs-comment\">\/\/ Erase the second and third elements<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><code>resize()<\/code> and its implications<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>resize()<\/code> changes the size of the vector. If it&#8217;s resized to a larger size, new elements are added, and if resized to a smaller size, elements are removed.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\">vec.resize(<span class=\"hljs-number\">5<\/span>);    <span class=\"hljs-comment\">\/\/ Increases size to 5; new elements are default-initialized<\/span>\r\nvec.resize(<span class=\"hljs-number\">3<\/span>);    <span class=\"hljs-comment\">\/\/ Decreases size to 3; last two elements are removed<\/span>\r\nvec.resize(<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">42<\/span>);  <span class=\"hljs-comment\">\/\/ Increases size to 5; new elements are initialized with value 42<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Implications<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Resizing can trigger reallocations, which means iterators, references, and pointers to the elements might become invalidated.<\/li>\n\n\n\n<li>It can be used to quickly remove or add multiple elements.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><code>swap()<\/code> with another vector<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>swap()<\/code> exchanges the content of the vector with that of another vector.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec1 = {<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>};\r\n<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec2 = {<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">6<\/span>, <span class=\"hljs-number\">7<\/span>};\r\n\r\nvec1.swap(vec2);  <span class=\"hljs-comment\">\/\/ vec1: 4, 5, 6, 7 and vec2: 1, 2, 3<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Note<\/strong>: <code>swap()<\/code> is a very efficient operation, regardless of the vector sizes, as it doesn&#8217;t perform a deep copy, but rather exchanges internal pointers.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vector Capacity and Management<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When working with <code>std::vector<\/code>, it&#8217;s crucial to understand the distinction between its size and its capacity, as well as how the container manages its underlying memory. Let&#8217;s dive into these concepts and their real-world performance implications.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Understanding Capacity vs. Size<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Size<\/strong>: This is the number of elements that the vector currently holds.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec = {<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>};\r\n<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; vec.size();  <span class=\"hljs-comment\">\/\/ Outputs: 3<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Capacity<\/strong>: Represents the amount of storage space that the vector has allocated, which might be greater than the space the actual elements consume. This additional space reduces the number of memory reallocations when new elements are added to the vector.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; vec.capacity();  <span class=\"hljs-comment\">\/\/ Outputs a value &gt;= 3<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><code>reserve()<\/code> and its Use Cases<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>reserve()<\/code> is a function that allows you to request a change in the capacity of the vector. If the passed argument is greater than the current capacity, the function reallocates memory to meet the request. Otherwise, it does nothing.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\">vec.reserve(<span class=\"hljs-number\">10<\/span>);  <span class=\"hljs-comment\">\/\/ Ensure vec has enough memory allocated to hold 10 elements without reallocating<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Use Cases:<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Performance Optimization<\/strong>: If you know beforehand how many elements will be inserted into a vector (e.g., in a loop), calling <code>reserve()<\/code> once can prevent multiple reallocations, thus enhancing performance.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; values;\r\nvalues.reserve(<span class=\"hljs-number\">1000<\/span>);\r\n<span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">1000<\/span>; ++i) {\r\n    values.push_back(i);\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In the above code, despite adding 1000 elements, the vector reallocates its memory only once.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Avoiding Iterator Invalidation<\/strong>: Reallocation might invalidate iterators. By using <code>reserve()<\/code>, you can ensure no reallocation occurs, preserving the validity of iterators.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>shrink_to_fit()<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This member function requests the vector to reduce its capacity to fit its size, potentially freeing up memory.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\">vec.shrink_to_fit();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Note that while this can save memory, it may involve a memory reallocation, and thus can invalidate iterators.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Real-world Implications on Performance<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Understanding the dynamics between size and capacity is crucial for performance-critical applications.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Unnecessary Reallocations<\/strong>: Without using <code>reserve()<\/code>, adding many elements to a vector can cause multiple reallocations, each potentially copying all elements to a new memory location. This can drastically slow down your program.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-comment\">\/\/ Slower due to potential multiple reallocations<\/span>\r\n<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; slowVec;\r\n<span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">1000<\/span>; ++i) {\r\n    slowVec.push_back(i);\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Memory Overhead<\/strong>: Over-reserving can lead to wasted memory, as you&#8217;re holding onto memory you aren&#8217;t using.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Frequent Shrinking<\/strong>: While <code>shrink_to_fit()<\/code> can be used to optimize memory usage, using it frequently can also introduce performance penalties due to reallocations.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Iterating through <code>std::vector<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">One of the most common operations on <code>std::vector<\/code> (or any container) is iterating over its elements. There are various methods to achieve this, each having its own merits.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Traditional Indexed Loop<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The classic way, treating <code>std::vector<\/code> like an array and accessing elements using their index.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec = {<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>};\r\n<span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">size_t<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; vec.size(); ++i) {\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; vec&#91;i] &lt;&lt; <span class=\"hljs-string\">\" \"<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Using Iterators<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Iterators provide a powerful and generic way to access and manipulate elements in a container.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Using <code>begin()<\/code> and <code>end()<\/code><\/strong>:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;::iterator it = vec.begin(); it != vec.end(); ++it) {\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; *it &lt;&lt; <span class=\"hljs-string\">\" \"<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Using <code>rbegin()<\/code> and <code>rend()<\/code> for reverse iteration<\/strong>:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;::reverse_iterator rit = vec.rbegin(); rit != vec.rend(); ++rit) {\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; *rit &lt;&lt; <span class=\"hljs-string\">\" \"<\/span>;  <span class=\"hljs-comment\">\/\/ Outputs elements in reverse order<\/span>\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Using C++11 Range-based For Loop<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Introduced in C++11, the range-based for loop offers a more concise way to iterate over all elements in a container.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">auto<\/span> &amp;value : vec) {\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; value &lt;&lt; <span class=\"hljs-string\">\" \"<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Examples of Common Operations Using Different Iteration Methods:<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Modify each element<\/strong> (double each value in the vector):<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Using indexed loop:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">size_t<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; vec.size(); ++i) {\r\n    vec&#91;i] *= <span class=\"hljs-number\">2<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Using iterators:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">auto<\/span> it = vec.begin(); it != vec.end(); ++it) {\r\n    *it *= <span class=\"hljs-number\">2<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Using range-based for loop (note the use of reference):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">auto<\/span> &amp;value : vec) {\r\n    value *= <span class=\"hljs-number\">2<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Find an element<\/strong> (search for the number 3):<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Using indexed loop:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">size_t<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; vec.size(); ++i) {\r\n    <span class=\"hljs-keyword\">if<\/span> (vec&#91;i] == <span class=\"hljs-number\">3<\/span>) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Found at index \"<\/span> &lt;&lt; i &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">break<\/span>;\r\n    }\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Using iterators:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">auto<\/span> it = <span class=\"hljs-built_in\">std<\/span>::find(vec.begin(), vec.end(), <span class=\"hljs-number\">3<\/span>);\r\n<span class=\"hljs-keyword\">if<\/span> (it != vec.end()) {\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Found at position \"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::distance(vec.begin(), it) &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Using range-based for loop:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">size_t<\/span> index = <span class=\"hljs-number\">0<\/span>;\r\n<span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">auto<\/span> &amp;value : vec) {\r\n    <span class=\"hljs-keyword\">if<\/span> (value == <span class=\"hljs-number\">3<\/span>) {\r\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Found at index \"<\/span> &lt;&lt; index &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\r\n        <span class=\"hljs-keyword\">break<\/span>;\r\n    }\r\n    ++index;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">While all these methods allow you to iterate over the contents of a <code>std::vector<\/code>, the right choice depends on the particular task at hand. The range-based for loop is often favored for its readability, but traditional methods can offer more control in specific scenarios.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Special Member Functions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In C++, the term &#8220;special member functions&#8221; refers to certain functions that the compiler can provide default implementations for. In the context of <code>std::vector<\/code>, understanding these is crucial to using vectors effectively, especially when it comes to copy and move semantics.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Constructors and Destructor<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Default Constructor<\/strong>: Constructs an empty vector.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec1;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Copy Constructor<\/strong>: Constructs a vector with a copy of the contents of another.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec2 = {<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>};\r\n<span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; <span class=\"hljs-title\">vec3<\/span><span class=\"hljs-params\">(vec2)<\/span><\/span>;  <span class=\"hljs-comment\">\/\/ Copy constructor<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Move Constructor<\/strong>: Moves the contents of another vector to this vector.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; <span class=\"hljs-title\">vec4<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::move(vec2))<\/span><\/span>;  <span class=\"hljs-comment\">\/\/ Move constructor<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Note<\/strong>: After the move, <code>vec2<\/code> is in a valid but unspecified state and can still be used.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Destructor<\/strong>: Cleans up resources (like memory) when the vector goes out of scope or is explicitly destroyed.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\">{\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec = {<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>};\r\n}  <span class=\"hljs-comment\">\/\/ vec's destructor is called automatically here<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Copy and Move Semantics<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Understanding copy and move semantics is crucial as it determines how vectors handle resources and how they interact with other objects.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Copy Semantics<\/strong>: It involves creating a new vector that&#8217;s a copy of an existing one. All elements from the source vector are copied to the destination vector.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">std::vector&lt;int&gt; vecA = {<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">6<\/span>};\r\nstd::vector&lt;int&gt; vecB = vecA;  <span class=\"hljs-comment\">\/\/ Copy semantics<\/span>\r\n\r\nstd::cout &lt;&lt; vecB&#91;<span class=\"hljs-number\">0<\/span>];  <span class=\"hljs-comment\">\/\/ Outputs: 4<\/span>\r\nvecA&#91;<span class=\"hljs-number\">0<\/span>] = <span class=\"hljs-number\">99<\/span>;\r\nstd::cout &lt;&lt; vecB&#91;<span class=\"hljs-number\">0<\/span>];  <span class=\"hljs-comment\">\/\/ Still outputs: 4 (because vecB is a separate copy)<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Move Semantics<\/strong>: Introduced in C++11, move semantics allows resources owned by one object to be &#8220;moved&#8221; to another without copying. This is particularly useful for objects like vectors that manage dynamic memory.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vecC = {<span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">8<\/span>, <span class=\"hljs-number\">9<\/span>};\r\n<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vecD = <span class=\"hljs-built_in\">std<\/span>::move(vecC);  <span class=\"hljs-comment\">\/\/ Move semantics<\/span>\r\n\r\n<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; vecD&#91;<span class=\"hljs-number\">0<\/span>];  <span class=\"hljs-comment\">\/\/ Outputs: 7<\/span>\r\n<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; vecC.size();  <span class=\"hljs-comment\">\/\/ Outputs: 0 (or some unspecified value, since vecC has been moved from)<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Benefits<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Performance<\/strong>: Move operations are usually faster because they transfer ownership of resources rather than copying them.<\/li>\n\n\n\n<li><strong>Flexibility<\/strong>: Move semantics allows for the creation of objects that can&#8217;t be copied (e.g., <code>std::unique_ptr<\/code>), but can be moved.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Copy\/Move Assignment<\/strong>: Apart from constructors, vectors also support assignment operations.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">std::vector&lt;int&gt; vecE, vecF;\r\nvecE = vecA;  <span class=\"hljs-comment\">\/\/ Copy assignment<\/span>\r\nvecF = std::move(vecE);  <span class=\"hljs-comment\">\/\/ Move assignment<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Advanced Features &amp; Techniques with <code>std::vector<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>std::vector<\/code> is more than just a dynamic array; it offers several advanced features that can cater to specific needs, particularly in performance-critical scenarios.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Allocator-aware Container<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every <code>std::vector<\/code> is an allocator-aware container, meaning that it uses an allocator object to manage its storage needs. By default, <code>std::vector<\/code> uses the <code>std::allocator<\/code> class, but you can provide your own custom allocator if necessary.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Using Custom Allocators with <code>std::vector<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sometimes, you might want to have more control over how memory is allocated and deallocated, especially in applications where memory usage patterns are well-understood. This is where custom allocators come in.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A custom allocator needs to adhere to the Allocator concept defined by the C++ standard. Here&#8217;s a very basic example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">template<\/span> &lt;<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">T<\/span>&gt;\r\n<span class=\"hljs-title\">struct<\/span> <span class=\"hljs-title\">CustomAllocator<\/span> {<\/span>\r\n    <span class=\"hljs-keyword\">typedef<\/span> T value_type;\r\n    <span class=\"hljs-function\">T* <span class=\"hljs-title\">allocate<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-keyword\">size_t<\/span> n)<\/span> <\/span>{\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> T&#91;n];\r\n    }\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">deallocate<\/span><span class=\"hljs-params\">(T* p, <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-keyword\">size_t<\/span> n)<\/span> <\/span>{\r\n        <span class=\"hljs-keyword\">delete<\/span>&#91;] p;\r\n    }\r\n};\r\n\r\n<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>, CustomAllocator&lt;<span class=\"hljs-keyword\">int<\/span>&gt;&gt; vec;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In practice, a custom allocator might use memory pools, shared memory, or some other memory management strategy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Emplacement: <code>emplace()<\/code> &amp; <code>emplace_back()<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of constructing an object and then copying\/moving it into a vector, emplacement constructs the object directly within the vector&#8217;s storage. This can provide performance benefits, especially for types that are expensive to copy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>emplace_back()<\/code><\/strong>: Adds a new element to the end of the vector, constructed in place.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-built_in\">std<\/span>::pair&lt;<span class=\"hljs-keyword\">int<\/span>, <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span>&gt;&gt; vec;\r\nvec.emplace_back(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-string\">\"one\"<\/span>);  <span class=\"hljs-comment\">\/\/ Constructs a pair inside the vector<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong><code>emplace()<\/code><\/strong>: Inserts a new element into the vector at a specified position, constructed in place.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-keyword\">auto<\/span> it = vec.begin();\r\nvec.emplace(it, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-string\">\"two\"<\/span>);  <span class=\"hljs-comment\">\/\/ Constructs a pair inside the vector at the beginning<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Use Cases and Performance Advantages<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Avoiding Temporary Objects<\/strong>: Emplacement can avoid the creation of temporary objects which are then moved\/copied into the vector.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ExpensiveToCopy<\/span> {<\/span>\r\n    <span class=\"hljs-comment\">\/\/ ... some data and methods ...<\/span>\r\n};\r\n\r\n<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;ExpensiveToCopy&gt; vec;\r\nvec.emplace_back(<span class=\"hljs-comment\">\/* constructor arguments *\/<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In the above code, the object is constructed directly inside the vector without any temporary object or unnecessary copy\/move operations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Using with Custom Objects<\/strong>: Emplacement is particularly beneficial when used with custom classes that have several constructors or require aggregating data from different sources.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Person<\/span> {<\/span>\r\n<span class=\"hljs-keyword\">public<\/span>:\r\n    Person(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span> name, <span class=\"hljs-keyword\">int<\/span> age) : name(name), age(age) {}\r\n    <span class=\"hljs-comment\">\/\/ ... other methods ...<\/span>\r\n<span class=\"hljs-keyword\">private<\/span>:\r\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">string<\/span> name;\r\n    <span class=\"hljs-keyword\">int<\/span> age;\r\n};\r\n\r\n<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;Person&gt; people;\r\npeople.emplace_back(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-number\">30<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Performance<\/strong>: Especially for larger objects or containers with many elements, using emplace can be faster than using push or insert, as it can avoid unnecessary temporary objects and copy\/move operations.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><code>std::vector<\/code> in Concurrency<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Concurrency in C++ introduces a set of challenges that developers need to be aware of, and when it comes to using <code>std::vector<\/code>, special attention must be paid to ensure safe and correct behavior.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Thread-safety Considerations<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Reads Are Safe<\/strong>: Multiple threads can read elements from a <code>std::vector<\/code> simultaneously without any problem.<\/li>\n\n\n\n<li><strong>Writes Need Synchronization<\/strong>: If at least one thread modifies a <code>std::vector<\/code>, and any other thread accesses it simultaneously (even if it&#8217;s just reading), you must synchronize access to the vector. This is because modifying operations (like <code>push_back()<\/code>, <code>emplace_back()<\/code>, <code>resize()<\/code>, etc.) might reallocate memory, making iterators, pointers, and references to the vector&#8217;s elements invalid.<\/li>\n\n\n\n<li><strong>No Concurrent Writes<\/strong>: You should not attempt to modify the same <code>std::vector<\/code> from multiple threads concurrently without synchronization, even if they&#8217;re writing to different parts of the vector.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Example Scenarios and Solutions<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Scenario 1<\/strong>: Multiple threads appending to a <code>std::vector<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong>: Without synchronization, threads might trigger simultaneous reallocations or overwrite each other&#8217;s data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong>: Use a mutex to ensure exclusive access to the <code>std::vector<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-56\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec;\r\n<span class=\"hljs-built_in\">std<\/span>::mutex vecMutex;\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">appendToVector<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> value)<\/span> <\/span>{\r\n    <span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::lock_guard&lt;<span class=\"hljs-built_in\">std<\/span>::mutex&gt; <span class=\"hljs-title\">lock<\/span><span class=\"hljs-params\">(vecMutex)<\/span><\/span>;\r\n    vec.push_back(value);\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-56\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\"><strong>Scenario 2<\/strong>: Multiple threads reading from and one thread writing to a <code>std::vector<\/code><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong>: Even if reads are safe, the write can invalidate the data being read by other threads.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong>: Use a shared mutex or reader-writer lock that allows concurrent reads but exclusive writes.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec;\r\n<span class=\"hljs-built_in\">std<\/span>::shared_mutex vecMutex;\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">readFromVector<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> index)<\/span> <\/span>{\r\n    <span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::shared_lock&lt;<span class=\"hljs-built_in\">std<\/span>::shared_mutex&gt; <span class=\"hljs-title\">lock<\/span><span class=\"hljs-params\">(vecMutex)<\/span><\/span>;\r\n    <span class=\"hljs-keyword\">return<\/span> vec&#91;index];\r\n}\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">writeToVector<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> index, <span class=\"hljs-keyword\">int<\/span> value)<\/span> <\/span>{\r\n    <span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::unique_lock&lt;<span class=\"hljs-built_in\">std<\/span>::shared_mutex&gt; <span class=\"hljs-title\">lock<\/span><span class=\"hljs-params\">(vecMutex)<\/span><\/span>;\r\n    vec&#91;index] = value;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-57\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\"><strong>Scenario 3<\/strong>: Multiple threads reading from a <code>std::vector<\/code> and occasionally updating<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong>: Frequent locking and unlocking can become a performance bottleneck.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong>: Opt for strategies like &#8220;copy-on-write&#8221; where you make a copy of the vector, modify the copy, and then atomically swap the pointers. This can be useful if reads are much more frequent than writes and if the vector isn&#8217;t too large.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-58\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;&gt; vecPtr = <span class=\"hljs-built_in\">std<\/span>::make_shared&lt;<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;&gt;();\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">updateVector<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; newData)<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">auto<\/span> newVec = <span class=\"hljs-built_in\">std<\/span>::make_shared&lt;<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt;&gt;(newData);\r\n    <span class=\"hljs-built_in\">std<\/span>::atomic_store(&amp;vecPtr, newVec);\r\n}\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">readFromSharedVector<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> index)<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">auto<\/span> localVecPtr = <span class=\"hljs-built_in\">std<\/span>::atomic_load(&amp;vecPtr);\r\n    <span class=\"hljs-keyword\">return<\/span> (*localVecPtr)&#91;index];\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-58\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Concurrency requires careful planning and design. With <code>std::vector<\/code> or any other container, understanding the implications of concurrent access is crucial. Always test concurrent code thoroughly to ensure thread safety and correctness.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Comparison with Other Containers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Each container in the C++ Standard Library serves a distinct purpose and is optimized for certain use cases. Let&#8217;s compare <code>std::vector<\/code> with <code>std::list<\/code> and <code>std::deque<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>std::vector<\/code> vs. <code>std::list<\/code><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Memory Layout<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>std::vector<\/code>: Uses a dynamic array, provides contiguous memory.<\/li>\n\n\n\n<li><code>std::list<\/code>: Doubly-linked list, non-contiguous memory.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Performance<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>std::vector<\/code>:\n<ul class=\"wp-block-list\">\n<li>O(1) for direct access and appending (amortized).<\/li>\n\n\n\n<li>O(n) for insertions\/deletions (except at the end).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>std::list<\/code>:\n<ul class=\"wp-block-list\">\n<li>O(1) for insertions\/deletions if iterator to the position is known.<\/li>\n\n\n\n<li>O(n) for direct access and searching.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Memory Overhead<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>std::vector<\/code>: Generally more memory-efficient due to contiguous layout.<\/li>\n\n\n\n<li><code>std::list<\/code>: Each element requires overhead for two pointers (previous and next).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Reallocation<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>std::vector<\/code>: Requires occasional reallocation as it grows.<\/li>\n\n\n\n<li><code>std::list<\/code>: No reallocation needed.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Use Cases<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Prefer <code>std::vector<\/code> when:\n<ul class=\"wp-block-list\">\n<li>Random access is needed.<\/li>\n\n\n\n<li>You&#8217;re mostly adding\/removing elements at the end.<\/li>\n\n\n\n<li>Contiguous memory is beneficial (e.g., cache locality).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Prefer <code>std::list<\/code> when:\n<ul class=\"wp-block-list\">\n<li>Frequent insertions\/deletions in the middle are required.<\/li>\n\n\n\n<li>You need stable iterators (i.e., insertions\/deletions don&#8217;t invalidate existing iterators).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><code>std::vector<\/code> vs. <code>std::deque<\/code><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Memory Layout<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>std::vector<\/code>: Contiguous memory.<\/li>\n\n\n\n<li><code>std::deque<\/code>: Array of fixed-size blocks; not fully contiguous but offers near-contiguous storage.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Performance<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>std::vector<\/code>:\n<ul class=\"wp-block-list\">\n<li>O(1) for direct access and appending (amortized).<\/li>\n\n\n\n<li>O(n) for inserting\/removing at the beginning.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>std::deque<\/code>:\n<ul class=\"wp-block-list\">\n<li>O(1) for direct access, appending, and prepending.<\/li>\n\n\n\n<li>O(n) for insertions\/deletions in the middle (though generally faster than a list in such cases due to better cache locality).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Reallocation<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>std::vector<\/code>: Requires reallocation as it grows.<\/li>\n\n\n\n<li><code>std::deque<\/code>: Rarely needs reallocation since it can grow in both directions.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Use Cases<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Prefer <code>std::vector<\/code> when:\n<ul class=\"wp-block-list\">\n<li>Contiguous memory is essential.<\/li>\n\n\n\n<li>You&#8217;re mostly dealing with insertions\/removals at the end.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Prefer <code>std::deque<\/code> when:\n<ul class=\"wp-block-list\">\n<li>You need fast insertions\/removals at both the beginning and end.<\/li>\n\n\n\n<li>You want near-contiguous memory with more flexibility than a vector.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">When to Use Which Container:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>std::vector<\/code><\/strong>: Default choice for most scenarios due to its cache-friendliness and efficiency.<\/li>\n\n\n\n<li><strong><code>std::list<\/code><\/strong>: When you need constant-time insertions\/removals in the middle or want stable iterators.<\/li>\n\n\n\n<li><strong><code>std::deque<\/code><\/strong>: When you need fast operations on both ends of the container.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s worth noting that the best container for a given situation depends not just on these theoretical considerations, but also on the specifics of the problem, data sizes, hardware, and actual observed performance.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Common Mistakes and Pitfalls with <code>std::vector<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The versatile nature of <code>std::vector<\/code> makes it a popular choice for many C++ developers. However, with its flexibility comes the possibility of misuse. Let&#8217;s discuss some common pitfalls and ways to avoid them.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Iterator Invalidation Scenarios<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong>: Iterators, pointers, and references to a <code>std::vector<\/code> might be invalidated after certain operations, leading to undefined behavior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-59\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec = {<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>};\r\n<span class=\"hljs-keyword\">auto<\/span> it = vec.begin();\r\nvec.push_back(<span class=\"hljs-number\">4<\/span>);\r\n<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; *it;  <span class=\"hljs-comment\">\/\/ This might lead to undefined behavior.<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-59\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong>: Be cautious after operations that might change the vector&#8217;s capacity (<code>push_back<\/code>, <code>emplace_back<\/code>, <code>resize<\/code>, etc.). Re-acquire iterators after such operations.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Reserving Without Consideration<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong>: Over-reserving space when it&#8217;s not needed can lead to unnecessary memory consumption.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-60\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec;\r\nvec.reserve(<span class=\"hljs-number\">1000000<\/span>);  <span class=\"hljs-comment\">\/\/ Reserving space for a million integers when you might only use a few is wasteful.<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-60\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong>: Use <code>reserve<\/code> judiciously. It&#8217;s a powerful tool for optimization when you know in advance how many elements you&#8217;ll insert, but avoid arbitrary large values.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Misusing Capacity and Size<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong>: Confusing <code>size()<\/code> (number of elements) with <code>capacity()<\/code> (allocated storage) can lead to logical errors.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-61\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec = {<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>};\r\nvec.reserve(<span class=\"hljs-number\">100<\/span>);\r\n<span class=\"hljs-keyword\">if<\/span> (vec.size() &lt; <span class=\"hljs-number\">100<\/span>) { \r\n    <span class=\"hljs-comment\">\/\/ This condition is true, but some might expect it to be false due to misunderstanding reserve().<\/span>\r\n    <span class=\"hljs-comment\">\/\/ ...<\/span>\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-61\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong>: Always remember:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>size()<\/code>: Current number of elements.<\/li>\n\n\n\n<li><code>capacity()<\/code>: Total storage currently allocated (capacity &gt;= size).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Unintentional Reallocation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong>: Continuously adding elements to a vector without considering its capacity might cause multiple reallocations, potentially degrading performance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-62\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec;\r\n<span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">1000000<\/span>; ++i) {\r\n    vec.push_back(i);  <span class=\"hljs-comment\">\/\/ This might cause several reallocations as the vector grows.<\/span>\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-62\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong>: If you know the number of elements or an upper bound beforehand, use <code>reserve()<\/code> to allocate sufficient memory at once.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Expecting a Vector to Shrink Automatically<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong>: Removing elements from a vector decreases its size but not its capacity.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example<\/strong>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-63\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec = {<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>};\r\nvec.erase(vec.begin(), vec.begin() + <span class=\"hljs-number\">3<\/span>);\r\n<span class=\"hljs-comment\">\/\/ vec.size() is now 2, but vec.capacity() remains unchanged.<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-63\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong>: If you want to reduce the capacity of a vector to fit its size after removing elements, use <code>shrink_to_fit()<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Optimization Tips for <code>std::vector<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A well-optimized use of <code>std::vector<\/code> can result in significantly better performance in your C++ applications. Here are some optimization tips to get the most out of this container:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Reserving Capacity Wisely<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Benefit<\/strong>: Reduces the number of reallocations and potential copy\/move operations.<\/li>\n\n\n\n<li><strong>Tip<\/strong>: If you have a good estimate of how many elements you&#8217;ll be inserting into the vector, use <code>reserve()<\/code> to pre-allocate memory.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-64\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec;\r\nvec.reserve(<span class=\"hljs-number\">1000<\/span>);  <span class=\"hljs-comment\">\/\/ Pre-allocate space for 1000 integers<\/span>\r\n<span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">1000<\/span>; ++i) {\r\n    vec.push_back(i);\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-64\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Using <code>shrink_to_fit()<\/code> Appropriately<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Benefit<\/strong>: Releases unused capacity, optimizing memory usage.<\/li>\n\n\n\n<li><strong>Tip<\/strong>: If you&#8217;ve removed a substantial number of elements or if you know that the vector won&#8217;t grow much more, consider shrinking its capacity.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-65\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec = {<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>};\r\nvec.erase(vec.begin(), vec.begin() + <span class=\"hljs-number\">3<\/span>);  <span class=\"hljs-comment\">\/\/ Remove the first 3 elements<\/span>\r\nvec.shrink_to_fit();  <span class=\"hljs-comment\">\/\/ Reduce the capacity to fit the current size<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-65\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Avoiding Frequent Inserts\/Deletions in the Middle<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Benefit<\/strong>: Improves performance by avoiding the overhead of shifting elements.<\/li>\n\n\n\n<li><strong>Tip<\/strong>: <code>std::vector<\/code> is optimized for fast access and insertions at the end. If you find yourself frequently inserting or removing elements from the middle, consider if another container, like <code>std::list<\/code> or <code>std::deque<\/code>, might be more suitable.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-66\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;<span class=\"hljs-keyword\">int<\/span>&gt; vec = {<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>};\r\n<span class=\"hljs-comment\">\/\/ Inserting in the middle requires shifting the subsequent elements<\/span>\r\nvec.insert(vec.begin() + <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>);  <span class=\"hljs-comment\">\/\/ Expensive operation for large vectors<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-66\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Preferring <code>emplace<\/code> Over <code>insert<\/code><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Benefit<\/strong>: Constructs elements in-place, avoiding unnecessary copy or move operations.<\/li>\n\n\n\n<li><strong>Tip<\/strong>: When inserting objects, use <code>emplace<\/code> or <code>emplace_back<\/code> to construct them directly within the vector.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-67\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span> <span class=\"hljs-title\">MyClass<\/span> {<\/span>\r\n    MyClass(<span class=\"hljs-keyword\">int<\/span> a, <span class=\"hljs-keyword\">double<\/span> b) : x(a), y(b) {}\r\n    <span class=\"hljs-keyword\">int<\/span> x;\r\n    <span class=\"hljs-keyword\">double<\/span> y;\r\n};\r\n\r\n<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">vector<\/span>&lt;MyClass&gt; vec;\r\nvec.emplace_back(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2.5<\/span>);  <span class=\"hljs-comment\">\/\/ Directly constructs MyClass inside the vector<\/span>\r\n\r\n<span class=\"hljs-function\">MyClass <span class=\"hljs-title\">obj<\/span><span class=\"hljs-params\">(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2.5<\/span>)<\/span><\/span>;\r\nvec.insert(vec.end(), obj);  <span class=\"hljs-comment\">\/\/ Potentially less efficient than emplace_back<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-67\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When working with <code>std::vector<\/code> or any container, always be mindful of the specific use-case and its requirements. A careful combination of design decisions and understanding the container&#8217;s underlying behavior can yield significant performance gains.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction std::vector stands as one of the linchpins of the C++ Standard Library, offering both novices and experienced developers a dynamic array with the ability to automatically manage its size. At its core, std::vector provides a way to store elements, typically of the same type, in a contiguous block of memory. Unlike standard arrays in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[9,4],"tags":[],"class_list":["post-1321","post","type-post","status-publish","format-standard","category-cplusplus","category-programming-languages","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>C++ std::vector: From Basics to Advanced<\/title>\n<meta name=\"description\" content=\"At its core, std::vector provides a way to store elements, typically of the same type, in a contiguous block of memory. Unlike standard\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.w3computing.com\/articles\/cpp-std-vector-from-basics-to-advanced\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C++ std::vector: From Basics to Advanced\" \/>\n<meta property=\"og:description\" content=\"At its core, std::vector provides a way to store elements, typically of the same type, in a contiguous block of memory. Unlike standard\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.w3computing.com\/articles\/cpp-std-vector-from-basics-to-advanced\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-09-10T20:25:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-10T20:26:00+00:00\" \/>\n<meta name=\"author\" content=\"w3compadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"w3compadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-std-vector-from-basics-to-advanced\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-std-vector-from-basics-to-advanced\\\/\"},\"author\":{\"name\":\"w3compadmin\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"headline\":\"C++ std::vector: From Basics to Advanced\",\"datePublished\":\"2023-09-10T20:25:55+00:00\",\"dateModified\":\"2023-09-10T20:26:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-std-vector-from-basics-to-advanced\\\/\"},\"wordCount\":3960,\"commentCount\":0,\"articleSection\":[\"C++\",\"Programming Languages\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-std-vector-from-basics-to-advanced\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-std-vector-from-basics-to-advanced\\\/\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-std-vector-from-basics-to-advanced\\\/\",\"name\":\"C++ std::vector: From Basics to Advanced\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\"},\"datePublished\":\"2023-09-10T20:25:55+00:00\",\"dateModified\":\"2023-09-10T20:26:00+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"description\":\"At its core, std::vector provides a way to store elements, typically of the same type, in a contiguous block of memory. Unlike standard\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-std-vector-from-basics-to-advanced\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-std-vector-from-basics-to-advanced\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/cpp-std-vector-from-basics-to-advanced\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Articles Home\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programming Languages\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"C++ std::vector: From Basics to Advanced\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\",\"name\":\"Developer Articles Hub\",\"description\":\"\",\"alternateName\":\"Developer Articles\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\",\"name\":\"w3compadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780747165\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780747165\",\"contentUrl\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780747165\",\"caption\":\"w3compadmin\"},\"sameAs\":[\"http:\\\/\\\/w3computing.com\\\/articles\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C++ std::vector: From Basics to Advanced","description":"At its core, std::vector provides a way to store elements, typically of the same type, in a contiguous block of memory. Unlike standard","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.w3computing.com\/articles\/cpp-std-vector-from-basics-to-advanced\/","og_locale":"en_US","og_type":"article","og_title":"C++ std::vector: From Basics to Advanced","og_description":"At its core, std::vector provides a way to store elements, typically of the same type, in a contiguous block of memory. Unlike standard","og_url":"https:\/\/www.w3computing.com\/articles\/cpp-std-vector-from-basics-to-advanced\/","article_published_time":"2023-09-10T20:25:55+00:00","article_modified_time":"2023-09-10T20:26:00+00:00","author":"w3compadmin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"w3compadmin","Est. reading time":"18 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.w3computing.com\/articles\/cpp-std-vector-from-basics-to-advanced\/#article","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/cpp-std-vector-from-basics-to-advanced\/"},"author":{"name":"w3compadmin","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"headline":"C++ std::vector: From Basics to Advanced","datePublished":"2023-09-10T20:25:55+00:00","dateModified":"2023-09-10T20:26:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.w3computing.com\/articles\/cpp-std-vector-from-basics-to-advanced\/"},"wordCount":3960,"commentCount":0,"articleSection":["C++","Programming Languages"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.w3computing.com\/articles\/cpp-std-vector-from-basics-to-advanced\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.w3computing.com\/articles\/cpp-std-vector-from-basics-to-advanced\/","url":"https:\/\/www.w3computing.com\/articles\/cpp-std-vector-from-basics-to-advanced\/","name":"C++ std::vector: From Basics to Advanced","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/#website"},"datePublished":"2023-09-10T20:25:55+00:00","dateModified":"2023-09-10T20:26:00+00:00","author":{"@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"description":"At its core, std::vector provides a way to store elements, typically of the same type, in a contiguous block of memory. Unlike standard","breadcrumb":{"@id":"https:\/\/www.w3computing.com\/articles\/cpp-std-vector-from-basics-to-advanced\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.w3computing.com\/articles\/cpp-std-vector-from-basics-to-advanced\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.w3computing.com\/articles\/cpp-std-vector-from-basics-to-advanced\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Articles Home","item":"https:\/\/www.w3computing.com\/articles\/"},{"@type":"ListItem","position":2,"name":"Programming Languages","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/"},{"@type":"ListItem","position":3,"name":"C++ std::vector: From Basics to Advanced"}]},{"@type":"WebSite","@id":"https:\/\/www.w3computing.com\/articles\/#website","url":"https:\/\/www.w3computing.com\/articles\/","name":"Developer Articles Hub","description":"","alternateName":"Developer Articles","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.w3computing.com\/articles\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561","name":"w3compadmin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780747165","url":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780747165","contentUrl":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780747165","caption":"w3compadmin"},"sameAs":["http:\/\/w3computing.com\/articles"]}]}},"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"w3compadmin","author_link":"https:\/\/www.w3computing.com\/articles\/author\/w3compadmin\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1321","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/comments?post=1321"}],"version-history":[{"count":9,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1321\/revisions"}],"predecessor-version":[{"id":1330,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1321\/revisions\/1330"}],"wp:attachment":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/media?parent=1321"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/categories?post=1321"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/tags?post=1321"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}