Namespaces
Variants

std::ranges:: iter_swap

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
定义于头文件 <iterator>
namespace ranges {

inline namespace /* 未指定 */ {
inline constexpr /* 未指定 */
iter_swap = /* 未指定 */ ;
}

}
(C++20 起)
(定制点对象)
调用签名
template < class I1, class I2 >
constexpr void iter_swap ( I1 && i1, I2 && i2 ) noexcept ( /* 见下文 */ ) ;
(C++20 起)
辅助函数
template < class X, class Y >

constexpr std:: iter_value_t < X >
iter - exchange - move ( X && x, Y && y )
noexcept ( noexcept ( std:: iter_value_t < X > ( std :: ranges:: iter_move ( x ) ) ) &&

noexcept ( * x = std :: ranges:: iter_move ( y ) ) ) ;
( 仅用于说明* )

交换两个迭代器所指向的值。

仅用于说明的辅助函数 iter-exchange-move 的效果等同于

std::iter_value_t<X> old(std::ranges::iter_move(x));
*x = std::ranges::iter_move(y);
return old;

ranges :: iter_swap ( i1, i2 ) 表达式等价性 上等同于:

  1. ( void ) iter_swap ( i1, i2 ) ,若 i1 i2 具有类或枚举类型且表达式合法,其中 iter_swap 重载决议 会包含额外候选函数 void iter_swap ( auto , auto ) = delete ; [1] ,但不包含 std::ranges::iter_swap 自身。
    • 若选中的重载未交换 i1 i2 所表示的值,则程序非良构,不要求诊断。
  2. 否则, ranges:: swap ( * i1, * i2 ) ,若 I1 I2 均满足 indirectly_readable std:: iter_reference_t < I1 > std:: iter_reference_t < I2 > 满足 swappable_with
  3. 否则, ( void ) ( * i1 = iter-exchange-move ( i2, i1 ) ) ,若 std:: indirectly_movable_storable < I1, I2 > std:: indirectly_movable_storable < I2, I1 > 均被满足,但 i1 仅被求值一次。
  4. 否则, ranges :: iter_swap ( i1, i2 ) 非良构,当 ranges :: iter_swap ( i1, i2 ) 出现在模板实例化的直接上下文时,可能导致 替换失败
  1. 这排除了调用无约束的 std::iter_swap

定制点对象

名称 ranges::iter_swap 表示一个 定制点对象 ,这是一个字面量 semiregular 类类型的常量 函数对象 。详细信息请参阅 定制点对象

示例

参见

(C++20)
交换两个已调整底层迭代器所指向的对象
(函数模板)
(C++20)
交换两个底层迭代器所指向的对象
(函数模板)
交换两个迭代器所指向的元素
(函数模板)