std::stack::stack(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ₯ž std::stack::stack(3)

Okay so this is the std::stack::stack page from the C++ Standard Libary manual β€” yes, the header spells it β€œLibary,” and your girl is keeping the lore intact ✨. This is all about constructing a std::stack, aka the container adaptor that’s giving β€œstacked, literally” energy πŸ’….


🌸 NAME 🌸

std::stack::stack β€” std::stack::stack (yes bestie, the name is the name, we love a self-titled icon πŸ‘‘).

✨ SYNOPSIS ✨

stack() : stack(Container()) {}                     (1) (since C++11)
explicit stack( const Container& cont = Container()      (until C++11)
             );
explicit stack( const Container& cont );                 (2) (since C++11)
explicit stack( Container&& cont );                      (3) (since C++11)
stack( const stack& other );                             (4) (implicitly declared) (since C++11)
stack( stack&& other );                                  (5) (implicitly declared) (since C++11)
template< class InputIt >                                (6) (since C++23)
stack( InputIt first, InputIt last );
template< class Alloc >                                  (7) (since C++11)
explicit stack( const Alloc& alloc );
template< class Alloc >                                  (8) (since C++11)
stack( const Container& cont, const Alloc& alloc );
template< class Alloc >                                  (9) (since C++11)
stack( Container&& cont, const Alloc& alloc );
template< class Alloc >                                  (10) (since C++11)
stack( const stack& other, const Alloc& alloc );
template< class Alloc >                                  (11) (since C++11)
stack( stack&& other, const Alloc& alloc );
template< class InputIt, class Alloc >
stack( InputIt first, InputIt last, const Alloc&        (12) (since C++23)
       alloc );
template< container-compatible-range<T> R>               (13) (since C++23)
stack( std::from_range_t, R&& rg );
template< container-compatible-range<T> R, class Alloc > (14) (since C++23)
stack( std::from_range_t, R&& rg, const Alloc&
       alloc );

πŸ’– DESCRIPTION πŸ’–

Constructs new underlying container of the container adaptor from a variety of data sources.

Okay so here’s the breakdown, bestie β€” all 14 overloads, no skips, no cap:

  1. Default constructor. Value-initializes the container.
  2. Copy-constructs the underlying container c with the contents of cont. This is also the default constructor. (until C++11)
  3. Move-constructs the underlying container c with std::move(cont).
  4. Copy constructor. The adaptor is copy-constructed with the contents of other.c.
  5. Move constructor. The adaptor is constructed with std::move(other.c).
  6. Constructs the underlying container c with the contents of the range [first, last). This overload participates in overload resolution only if InputIt satisfies LegacyInputIterator.

Okay, before we hit 7 through 12: these constructors participate in overload resolution only if std::uses_allocator<Container, Alloc>::value is true, that is, if the underlying container is an allocator-aware container (true for all standard library containers that can be used with stack).

  1. Constructs the underlying container using alloc as allocator, as if by c(alloc).
  2. Constructs the underlying container with the contents of cont and using alloc as allocator, as if by c(cont, alloc).
  3. Constructs the underlying container with the contents of cont using move semantics while utilizing alloc as allocator, as if by c(std::move(cont), alloc).
  4. Constructs the adaptor with the contents of other.c and using alloc as allocator, as if by c(other.c, alloc).
  5. Constructs the adaptor with the contents of other using move semantics while utilizing alloc as allocator, as if by c(std::move(other.c), alloc).
  6. Constructs the underlying container with the contents of the range [first, last) using alloc as allocator, as if by c(first, last, alloc). This overload participates in overload resolution only if InputIt satisfies LegacyInputIterator.
  7. Constructs the underlying container with ranges::to<Container>(std::forward<R>(rg)).
  8. Constructs the underlying container with ranges::to<Container>(std::forward<R>(rg), alloc).

🧚 PARAMETERS 🧚

  • alloc β€” allocator to use for all memory allocations of the underlying container.
  • other β€” another container adaptor to be used as source to initialize the underlying container.
  • cont β€” container to be used as source to initialize the underlying container.
  • first, last β€” range of elements [first, last) to initialize with.
  • rg β€” a container compatible range, that is, an input_range whose elements are convertible to T.

πŸ¦‹ TYPE REQUIREMENTS πŸ¦‹

  • Alloc must meet the requirements of Allocator.
  • Container must meet the requirements of Container. The constructors taking an allocator parameter participate in overload resolution only if Container meets the requirements of AllocatorAwareContainer.
  • InputIt must meet the requirements of LegacyInputIterator.

⏳ COMPLEXITY ⏳

Same as the corresponding operation on the wrapped container.

πŸ“ NOTES πŸ“

Feature-test macro tea, served fresh:

  • __cpp_lib_adaptor_iterator_pair_constructor β€” value 202106L, std (C++23), feature: β€œIterator pair constructors for std::queue and std::stack; overloads (6) and (12)”.
  • __cpp_lib_containers_ranges β€” value 202202L, std (C++23), feature: β€œRanges-aware construction and insertion; overloads (13) and (14)”.

πŸ“ EXAMPLE πŸ“

// Run this code β€” literally, go run it, bestie:

        #include <cassert>
        #include <deque>
        #include <iostream>
        #include <memory>
        #include <ranges>
        #include <stack>

        int main()
        {
            std::stack<int> c1;
            c1.push(5);
            assert(c1.size() == 1);

            std::stack<int> c2(c1);
            assert(c2.size() == 1);

            std::deque<int> deq{3, 1, 4, 1, 5};
            std::stack<int> c3(deq); // overload (2)
            assert(c3.size() == 5);

        # ifdef __cpp_lib_adaptor_iterator_pair_constructor
            const auto il = {2, 7, 1, 8, 2};
            std::stack<int> c4{il.begin(), il.end()}; // C++23, (6)
            assert(c4.size() == 5);
        # endif

        # if __cpp_lib_containers_ranges >= 202202L
            // C++23, overload (13)
            auto c5 = std::stack(std::from_range_t, std::ranges::iota(0, 42));
            assert(c5.size() == 42);

            // the same effect with pipe syntax, internally uses overload (13)
            auto c6 = std::ranges::iota(0, 42) | std::ranges::to<std::stack>();
            assert(c6.size() == 42);

            std::allocator<int> alloc;

            // C++23, overload (14)
            auto c7 = std::stack(std::from_range_t, std::ranges::iota(0, 42),
       alloc);
            assert(c7.size() == 42);

            // the same effect with pipe syntax, internally uses overload (14)
            auto c8 = std::ranges::iota(0, 42) |
       std::ranges::to<std::stack>(alloc);
            assert(c8.size() == 42);
        # endif
        }

🧚 DEFECT REPORTS 🧚

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

  • P0935R0 β€” applied to C++11. Behavior as published: β€œdefault constructor was explicit.” Correct behavior: β€œmade implicit.”

πŸ‘‘ SEE ALSO πŸ‘‘

  • operator= β€” assigns values to the container adaptor (public member function).

mwah πŸ’‹ β€” source/version: http://cppreference.com; date: 2024.06.10; page: std::stack::stack(3). Stay stacked, bestie πŸ™ˆπŸ’–

πŸ“¦ where this page comes from