Constrained algorithms and algorithms on ranges(C++20) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Constrained algorithms, e.g.ranges::copy,ranges::sort, ... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Execution policies(C++17) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Numeric operations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Operations on uninitialized memory | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Defined in header <algorithm> | ||
template<class ForwardIt1,class ForwardIt2> void iter_swap( ForwardIt1 a, ForwardIt2 b); | (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:
Contents |
a, b | - | iterators to the elements to swap |
Type requirements | ||
-ForwardIt1, ForwardIt2 must meet the requirements ofLegacyForwardIterator. |
(none)
Constant.
This function template models the semantics of the swap operation given bySwappable. That is, overloads ofswap found byADL and the fall back ofstd::swap are considered.
template<class ForwardIt1,class ForwardIt2>constexpr//< since C++20void iter_swap(ForwardIt1 a, ForwardIt2 b){usingstd::swap; swap(*a,*b);} |
The following is an implementation of selection sort in C++.
#include <algorithm>#include <iostream>#include <random>#include <string_view>#include <vector> template<class ForwardIt>void selection_sort(ForwardIt begin, ForwardIt end){for(ForwardIt it= begin; it!= end;++it) std::iter_swap(it,std::min_element(it, end));} void println(std::string_view rem,std::vector<int>const& v){std::cout<< rem;for(int e: v)std::cout<< e<<' ';std::cout<<'\n';} template<int min,int max>int rand_int(){staticstd::uniform_int_distribution dist(min, max);staticstd::mt19937 gen(std::random_device{}());return dist(gen);} int main(){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
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 whetherswap is used | the effect is equivalent toswap(*a,*b) |
swaps the values of two objects (function template)[edit] | |
swaps two ranges of elements (function template)[edit] | |
(C++20) | swaps the objects pointed to by two adjusted underlying iterators (function template)[edit] |
(C++20) | swaps the objects pointed to by two underlying iterators (function template)[edit] |
(C++20) | swaps the values referenced by two dereferenceable objects (customization point object)[edit] |