std::set::merge(3)

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

πŸ’– NAME πŸ’–

okay so bestie, this is the page for std::set::merge β€” literally std::set::merge, the self-titled icon. We're in std::set::merge(3), straight outta the C++ Standard Libary. The whole vibe: moving nodes from one container to another, and it's giving pointer surgery, not copy-paste. πŸ’…


🌸 Synopsis 🌸

Four overloads, all since C++17, all templated on class C2:

template< class C2 >                                      (1) (since C++17)
void merge( std::set<Key, C2, Allocator>& source );

template< class C2 >                                      (2) (since C++17)
void merge( std::set<Key, C2, Allocator>&& source );

template< class C2 >                                      (3) (since C++17)
void merge( std::multiset<Key, C2, Allocator>& source );

template< class C2 >                                      (4) (since C++17)
void merge( std::multiset<Key, C2, Allocator>&& source );

What it does, bestie: it attempts to extract (aka "splice") each element in source and insert it into *this using the comparison object of *this. If there is an element in *this with key equivalent to the key of an element from source, then that element is not extracted from source β€” it stays put. No elements are copied or moved; only the internal pointers of the container nodes are repointed. All pointers and references to the transferred elements remain valid, but now refer into *this, not into source. 🫢

🚨 okay serious warning: the behavior is undefined if get_allocator() != source.get_allocator(). That's not a vibe, that's a hard no. πŸ™ˆ

πŸŽ€ Parameters πŸŽ€

  • source β€” compatible container to transfer the nodes from. That's it, one parameter, main character energy. πŸ‘‘

🌈 Return value 🌈

(none) β€” literally no return value, bestie. It just does the merge thing. πŸ’«

πŸ’€ Exceptions πŸ’€

Does not throw unless comparison throws. That's the whole exception story. ✨

πŸ”₯ Complexity πŸ”₯

N * log(size() + N)), where N is source.size(). Yes, keep that formula exactly, extra ) and all β€” we don't fix the icon's typo, we stan it. 😭

πŸ¦‹ Example πŸ¦‹

Run this code, bestie:

#include <iostream>
#include <set>

// print out a container
template<class Os, class K>
Os& operator<<(Os& os, const std::set<K>& v)
{
    os << '[' << v.size() << "] {";
    bool o{};
    for (const auto& e : v)
        os << (o ? ", " : (o = 1, " ")) << e;
    return os << " }\n";
}

int main()
{
    std::set<char>
        p{'C', 'B', 'B', 'A'},
        q{'E', 'D', 'E', 'C'};

    std::cout << "p: " << p << "q: " << q;

    p.merge(q);

    std::cout << "p.merge(q);\n" << "p: " << p << "q: " << q;
}

🌟 Output: 🌟

p: [3] { A, B, C }
q: [3] { C, D, E }
p.merge(q);
p: [5] { A, B, C, D, E }
q: [1] { C }

πŸ‘€ See also πŸ‘€

  • extract β€” extracts nodes from the container; (C++17) (public member function).
  • insert β€” inserts elements or nodes; (since C++17) (public member function).

source: http://cppreference.com Β· version/date: 2024.06.10 Β· page: std::set::merge(3) β€” mwah, that's the footer tea πŸ’‹βœ¨

πŸ“¦ where this page comes from