std::unordered_set::end,(3)

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

πŸ’– std::unordered_set::end,(3) πŸ’–

okay so this page is from the C++ Standard Libary (their spelling, not mine, bestie) and it's all about std::unordered_set::end,(3). it's giving "tiny iterator page, huge main-character energy" ✨

🩷 NAME 🩷

std::unordered_set::end, β€” that's the name. the original literally spells it out as std::unordered_set::end, - std::unordered_set::end,, so we're keeping that exact comma moment. periodt πŸ’…

✨ Synopsis ✨

here's the whole squad, all noexcept, all since C++11:

iterator end() noexcept;              (1) (since C++11)
const_iterator end() const noexcept;  (2) (since C++11)
const_iterator cend() const noexcept; (3) (since C++11)

Returns an iterator to the element following the last element of the unordered_set.

This element acts as a placeholder; attempting to access it results in undefined behavior. no cap, do not dereference it β€” that's the undefined-behavior danger zone 😭

there's also a diagram named range-begin-end.svg in the original, just vibing there as a visual aid πŸ¦‹

🌸 Parameters 🌸

(none) β€” literally none, bestie. zero parameters. nada. πŸŽ€

πŸŽ€ Return value πŸŽ€

Iterator to the element following the last element. that's the whole return value, iconic and to the point πŸ’–

πŸ¦‹ Complexity πŸ¦‹

Constant. lowkey the easiest complexity check ever πŸ‘‘

πŸ’… Notes πŸ’…

Because both iterator and const_iterator are constant iterators (and may in fact be the same type), it is not possible to mutate the elements of the container through an iterator returned by any of these member functions. so yes, bestie, these iterators are look-only β€” no sneaky mutation through them 🫢

🌈 Example 🌈

the original says // Run this code, so here's the code block, exactly as it appears (line wraps in the comments and all β€” I'm not fixing the manpage's formatting, I'm just delivering the facts πŸ’€):

       // Run this code

        #include <iostream>
        #include <unordered_set>

        struct Point { double x, y; };

        int main()
        {
            Point pts[3] = {{1, 0}, {2, 0}, {3, 0}};

            // points is a set containing the addresses of points
            std::unordered_set<Point*> points = { pts, pts + 1, pts + 2 };

            // Change each y-coordinate of (i, 0) from 0 into i^2 and print the
       point
            for (auto iter = points.begin(); iter != points.end(); ++iter)
            {
                (*iter)->y = ((*iter)->x) * ((*iter)->x); // iter is a pointer-
       to-Point*
                std::cout << "(" << (*iter)->x << ", " << (*iter)->y << ") ";
            }
            std::cout << '\n';

            // Now using the range-based for loop, we increase each y-
       coordinate by 10
            for (Point* i : points)
            {
                i->y += 10;
                std::cout << "(" << i->x << ", " << i->y << ") ";
            }
        }

⭐ Possible output: ⭐

(3, 9) (1, 1) (2, 4)
(3, 19) (1, 11) (2, 14)

πŸ‘‘ See also πŸ‘‘

  • begin β€” returns an iterator to the beginning
  • cbegin β€” (public member function)
  • end
  • cend β€” returns an iterator to the end of a container or array
  • (C++11) β€” (function template)
  • (C++14)

that's the whole page, bestie πŸ’– it came from http://cppreference.com, version 2024.06.10, with footer title std::unordered_set::end,(3). mwah, go dereference something safe (not end(), obviously) πŸ’‹βœ¨

πŸ“¦ where this page comes from