std::iter_s...se_iterator)(3)

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

πŸ’– NAME πŸ’–

Okay so welcome to the C++ Standard Libary page for std::iter_swap(std::reverse_iterator) β€” manual name is spelled C++ Standard Libary exactly like that, and the page label/header thingy is std::iter_s...se_iterator)(3). We’re not fixing the typo, we’re honoring it. πŸ’…

std::iter_swap(std::reverse_iterator) β€” that’s the whole name. Periodt. 🫢

✨ Synopsis ✨

This overload is here since C++20, and the synopsis is literally this:

          template< std::indirectly_swappable<Iter> Iter2 >

              friend constexpr void
                  iter_swap( const reverse_iterator& x,
       (since C++20)

                             const std::reverse_iterator<Iter2>& y )
          noexcept(/*see below*/);

What it does? Swaps the objects pointed to by two adjusted underlying iterators. The function body is equivalent to:

        auto tmp_x = x.base();
        auto tmp_y = y.base();
        ranges::iter_swap(--tmp_x, --tmp_y);
🚨 Real talk, bestie: this function template is not visible to ordinary unqualified or qualified lookup, and can only be found by argument-dependent lookup when std::reverse_iterator<Iter> is an associated class of the arguments. That’s the whole rule, no cap.

🌸 Parameters 🌸

  • x, y β€” reverse iterators to the elements to swap ✨

πŸŽ€ Return value πŸŽ€

(none) β€” nothing comes back, it just does the swap. Iconic behavior. πŸ’«

🧚 Complexity 🧚

Constant. That’s it. No secret extra work, fr fr.

πŸ’œ Exceptions πŸ’œ

The noexcept specification is exactly this:

          noexcept(

              std::is_nothrow_copy_constructible_v<Iter> &&
              std::is_nothrow_copy_constructible_v<Iter2> &&
              noexcept(ranges::iter_swap(--std::declval<Iter&>(),
       --std::declval<Iter2&>()))

          )

πŸ“ Example πŸ“

       // Run this code

        #include <iostream>
        #include <iterator>
        #include <list>
        #include <vector>

        int main()
        {
            std::vector v{1, 2, 3};
            std::list l{4, 5, 6};

            std::reverse_iterator<std::vector<int>::iterator> r1{v.rbegin()};
            std::reverse_iterator<std::list<int>::iterator> r2{l.rbegin()};

            std::cout << *r1 << ' ' << *r2 << '\n';

            iter_swap(r1, r2); // ADL

            std::cout << *r1 << ' ' << *r2 << '\n';
        }

πŸ–₯️ Output πŸ–₯️

        3 6
        6 3

🌈 See also 🌈

  • swap β€” swaps the values of two objects (function template)
  • swap_ranges β€” swaps two ranges of elements (function template)
  • iter_swap β€” swaps the elements pointed to by two iterators (function template)
  • iter_swap β€” swaps the values referenced by two dereferenceable objects (C++20) (customization point object)
  • iter_swap β€” swaps the objects pointed to by two underlying iterators (C++20) (function template)

πŸ’… Category πŸ’…

Category: * conditionally noexcept πŸ’–


That’s the whole page, bestie. Source/version: http://cppreference.com β€’ date: 2024.06.10 β€’ page label: std::iter_s...se_iterator)(3). Mwah πŸ’‹βœ¨

πŸ“¦ where this page comes from