# std::iter_swap(std::counted_iterator)

< cpp‎ | iterator‎ | counted iterator

template< std::indirectly_swappable<I> I2> friend constexpr void iter_swap( const counted_iterator& x, const std::counted_iterator<I2>& y ) noexcept(noexcept(ranges::iter_swap(x.current, y.current))); |  | (C++20 起)

交换二个底层迭代器所指向的对象。若 x.count() 或 y.count() 等于 ​0​ 则行为未定义。

函数体等价于： ranges​::​iter_swap(x.current, y.current); ，其中 `current` 为底层迭代器。

此函数模板对通常无限定或有限定查找不可见，而只能在 `std::counted_iterator<I>` 为参数的关联类时由实参依赖查找找到。

### 参数

x, y | - | 要交换所指向元素的迭代器适配器

### 返回值

（无）

### 复杂度

常数。

### 示例

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

    int main()
    {
        std::vector p { 1, 2, 3, 4 },
                    q { 5, 6, 7, 8 };

        std::counted_iterator<std::vector<int>::iterator> ip { p.begin(), 2 };
        std::counted_iterator<std::vector<int>::iterator> iq { q.begin(), 3 };

        std::cout << *ip << ' ' << *iq << '\n';
        iter_swap(ip, iq); // ADL
        std::cout << *ip << ' ' << *iq << '\n';

        std::list x {0, 1, 3};
        std::counted_iterator<std::list<int>::iterator> ix { x.begin(), 2 };
    //  iter_swap(ip, ix); // 错误：不可间接交换
    }

输出：

    1 5
    5 1

### 参阅

swap | 交换两个对象的值 (函数模板)
swap_ranges | 交换两个范围的元素 (函数模板)
iter_swap | 交换两个迭代器所指向的元素 (函数模板)
iter_swap (C++20) | 交换两个可解引用对象所引用的值 (定制点对象)
iter_move (C++20) | 转型解引用底层迭代器的结果为其所关联的右值引用类型 (函数)