std::iter_swap - cppreference.com

From cppreference.com

template<classForwardIt1,classForwardIt2>voiditer_swap(ForwardIt1a,ForwardIt2b);(constexpr since C++20)Swaps the values of the elements the given iterators are pointing to.

If any of the following conditions is satisfied, the behavior is undefined:

a or b is not

dereferenceable

.

*a is not

Swappable

with *b.

Parameters

a, b - iterators to the elements to swap Type requirements -ForwardIt1, ForwardIt2 must meet the requirements of

LegacyForwardIterator

. Complexity

Constant.

Notes

This function template models the semantics of the swap operation given by

Swappable

. That is, overloads of swap found by

ADL

and the fall back of

std::swap

are considered.

Possible implementation

template<classForwardIt1,classForwardIt2>constexpr//< since C++20voiditer_swap(ForwardIt1a,ForwardIt2b){usingstd::swap;swap(*a,*b);}Example

The following is an implementation of selection sort in C++.

Run this code

#include<algorithm>#include<iostream>#include<random>#include<string_view>#include<vector>template<classForwardIt>voidselection_sort(ForwardItbegin,ForwardItend){for(ForwardItit=begin;it!=end;++it)std::iter_swap(it,std::min_element(it,end));}voidprintln(std::string_viewrem,std::vector<int>const&v){std::cout<<rem;for(inte:v)std::cout<<e<<' ';std::cout<<'\n';}template<intmin,intmax>intrand_int(){staticstd::uniform_int_distributiondist(min,max);staticstd::mt19937gen(std::random_device{}());returndist(gen);}intmain(){std::vector<int>v;std::generate_n(std::back_inserter(v),20,rand_int<-9,+9>);std::cout<<std::showpos;println("Before sort: ",v);selection_sort(v.begin(),v.end());println("After sort: ",v);}Possible output:

Before sort: -9 -3 +2 -8 +0 -1 +8 -4 -5 +1 -4 -5 +4 -9 -8 -6 -6 +8 -4 -6 After sort: -9 -9 -8 -8 -6 -6 -6 -5 -5 -4 -4 -4 -3 -1 +0 +1 +2 +4 +8 +8 Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior

LWG 187

C++98 it was unspecified whether swap is used the effect is equivalent to swap(*a,*b)See also

swap

swaps the values of two objects
(function template)

[edit]

swap_ranges

swaps two ranges of elements
(function template & algorithm function object)

[edit]

ranges::swap_ranges

(C++20)

iter_swap

(C++20)

swaps the objects pointed to by two adjusted underlying iterators
(function template)

[edit]

iter_swap

(C++20)

swaps the objects pointed to by two underlying iterators
(function template)

[edit]

ranges::iter_swap

(C++20)

swaps the values referenced by two dereferenceable objects
(customization point object)

[edit]