std::unordered_set::find(3)

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

πŸ’… NAME πŸ’…

okay so welcome to the C++ Standard Libary manual, bestie ✨ β€” this page is named std::unordered_set::find - std::unordered_set::find, and it is literally giving β€œlookup queen” energy. πŸ’…

πŸ” Synopsis πŸ”

here's the overload lineup, no cap:

iterator find( const Key& key );             (1) (since C++11)
const_iterator find( const Key& key ) const; (2) (since C++11)
template< class K >                          (3) (since C++20)
iterator find( const K& x );
template< class K >                          (4) (since C++20)
const_iterator find( const K& x ) const;

1,2) Finds an element with key equivalent to key.

3,4) Finds an element with key that compares equivalent to the value x. This overload participates in overload resolution only if Hash::is_transparent and KeyEqual::is_transparent are valid and each denotes a type. This assumes that such Hash is callable with both K and Key type, and that the KeyEqual is transparent, which, together, allows calling this function without constructing an instance of Key.

🌸 Parameters 🌸

  • key β€” key value of the element to search for
  • x β€” a value of any type that can be transparently compared with a key

that's the whole menu, bestie.

🫢 Return value 🫢

An iterator to the requested element. If no such element is found, past-the-end (see end()) iterator is returned. so if it's a miss, you get the end iterator, periodt.

πŸ”₯ Complexity πŸ”₯

Constant on average, worst case linear in the size of the container. average is chill, worst case is giving oof.

πŸ‘‘ Notes πŸ‘‘

the feature-test macro receipts:

  • Feature-test macro: __cpp_lib_generic_unordered_lookup
  • Value: 201811L
  • Std: (C++20)
  • Feature: Heterogeneous comparison lookup in unordered associative containers; overloads (3,4)

🧚 Example 🧚

Run this code πŸ’»:

#include <cstddef>
#include <functional>
#include <iostream>
#include <source_location>
#include <string>
#include <string_view>
#include <unordered_set>

using namespace std::literals;

namespace logger { bool enabled{false}; }

inline void who(const std::source_location sloc =
std::source_location::current())
{
    if (logger::enabled)
        std::cout << sloc.function_name() << '\n';
}

struct string_hash // C++20's transparent hashing
{
    using hash_type = std::hash<std::string_view>;
    using is_transparent = void;

    std::size_t operator()(const char* str) const
    {
        who();
        return hash_type{}(str);
    }
    std::size_t operator()(std::string_view str) const
    {
        who();
        return hash_type{}(str);
    }
    std::size_t operator()(std::string const& str) const
    {
        who();
        return hash_type{}(str);
    }
};

int main()
{
    std::unordered_set<int> example{1, 2, -10};

    std::cout << "Simple comparison demo:\n" << std::boolalpha;
    if (auto search = example.find(2); search != example.end())
        std::cout << "Found " << *search << '\n';
    else
        std::cout << "Not found\n";

    std::unordered_set<std::string, string_hash, std::equal_to<>>
set{"one"s, "two"s};

    logger::enabled = true;
    std::cout << "Heterogeneous lookup for unordered containers (transparent hashing):\n"
                  << (set.find("one")   != set.end()) << '\n'
                  << (set.find("one"s)  != set.end()) << '\n'
                  << (set.find("one"sv) != set.end()) << '\n';
}

🌈 Possible output 🌈

Simple comparison demo:
Found 2
Heterogeneous lookup for unordered containers (transparent hashing):
std::size_t string_hash::operator()(const char*) const
true
std::size_t string_hash::operator()(const std::string&) const
true
std::size_t string_hash::operator()(std::string_view) const
true

πŸ¦‹ See also πŸ¦‹

  • count β€” returns the number of elements matching specific key (public member function)
  • equal_range β€” returns range of elements matching a specific key (public member function)

okay that's the whole thing, bestie 🫢 β€” source is http://cppreference.com, dated 2024.06.10, and the page is std::unordered_set::find(3). mwah πŸ’‹

πŸ“¦ where this page comes from