Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::swap(3)		      C++ Standard Libary		  std::swap(3)

NAME
       std::swap - std::swap

Synopsis
	  Defined in header <algorithm>		     (until C++11)
	  Defined in header <utility>		     (since C++11)
	  Defined in header <string_view>	     (since C++17)
	  template<   class  T	>					(until
       C++11)
	  void swap( T&	a, T& b	);
	  template<  class  T  >					(since
       C++11)
	  void	swap(  T&  a,  T&  b ) noexcept(/*			(until
       C++20)
	  see below */);
	  template< class T >
	  constexpr void swap( T& a,  T&  b  )	     (1)		(since
       C++20)
	  noexcept(/* see below	*/);
	  template<	   class	T2,	   std::size_t	     N	     >
       (since C++11)
	  void	     swap(	  T2	    (&a)[N],	    T2	      (&b)[N])
       (until C++20)
	  noexcept(/* see below	*/);		     (2)
	  template< class T2, std::size_t N >
	  constexpr	   void	       swap(	    T2	     (&a)[N],	    T2
       (since C++20)
	  (&b)[N]) noexcept(/* see below */);

	  Exchanges the	given values.

	  1) Swaps the values a	and b.
	  This overload	does not participate in	overload resolution unless
	  std::is_move_constructible_v<T> &&  std::is_move_assignable_v<T>  is
       true.
	  (since C++17)
	  2)  Swaps  the  arrays  a and	b. In effect calls std::swap_ranges(a,
       a+N, b).
	  This overload	does not participate in	overload resolution unless
	  std::is_swappable_v<T2> is true.
	  (since C++17)

Parameters
	  a, b		    -		   the values to be swapped

Type requirements
	  -
	  T  must  meet	 the  requirements  of	MoveAssignable	and   MoveCon-
       structible.
	  -
	  T2 must meet the requirements	of Swappable.

Return value
	  (none)

Exceptions
	  1)

	  (none)					  (until C++11)
	  noexcept specification:
	  noexcept(

	  std::is_nothrow_move_constructible<T>::value && (since C++11)
	  std::is_nothrow_move_assignable<T>::value

	  )

	  2)

	  noexcept specification:
	  noexcept(noexcept(swap(*a, *b)))
	  The  lookup  for  the	identifier swap	in the exception specification
       (since C++11)
	  finds	this function template in addition to anything	found  by  the
       (until C++17)
	  usual	lookup rules, making the exception specification equivalent to
	  C++17	std::is_nothrow_swappable.
	  noexcept						specification:
       (since C++17)
	  noexcept(std::is_nothrow_swappable_v<T2>)

Complexity
	  1) Constant
	  2) Linear in N

Specializations
	  std::swap may	be specialized in namespace std	for program-defined
	  types, but such specializations are not found	by ADL (the  namespace
       (until C++20)
	  std is not the associated namespace for the program-defined type).

	  The expected way to make a program-defined type swappable is to pro-
       vide a non-member
	  function  swap  in the same namespace	as the type: see Swappable for
       details.

	  The following	overloads are already provided	by  the	 standard  li-
       brary:

	  std::swap(std::pair)		       specializes the std::swap algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::tuple)		      specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::shared_ptr)	       specializes the std::swap algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::weak_ptr)	      specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::unique_ptr)	       specializes the std::swap algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::function)	      specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::basic_string)	       specializes the std::swap algo-
       rithm
					      (function	template)
	  std::swap(std::array)		      specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::deque)		       specializes the std::swap algo-
       rithm
					      (function	template)
	  std::swap(std::forward_list)	      specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::list)		       specializes the std::swap algo-
       rithm
					      (function	template)
	  std::swap(std::vector)	      specializes the std::swap	 algo-
       rithm
					      (function	template)
	  std::swap(std::map)		       specializes the std::swap algo-
       rithm
					      (function	template)
	  std::swap(std::multimap)	      specializes the std::swap	 algo-
       rithm
					      (function	template)
	  std::swap(std::set)		       specializes the std::swap algo-
       rithm
					      (function	template)
	  std::swap(std::multiset)	      specializes the std::swap	 algo-
       rithm
					      (function	template)
	  std::swap(std::unordered_map)	       specializes the std::swap algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::unordered_multimap)  specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::unordered_set)	       specializes the std::swap algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::unordered_multiset)  specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::queue)		       specializes the std::swap algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::priority_queue)      specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::stack)		       specializes the std::swap algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::valarray)	      specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::basic_stringbuf)      specializes the std::swap algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::basic_istringstream) specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::basic_ostringstream)  specializes the std::swap algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::basic_stringstream)  specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::basic_filebuf)	       specializes the std::swap algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::basic_ifstream)      specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::basic_ofstream)       specializes the std::swap algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::basic_fstream)	      specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::basic_syncbuf)	       specializes the std::swap algo-
       rithm
	  (C++20)			      (function	template)
	  std::swap(std::basic_spanbuf)	      specializes the std::swap	 algo-
       rithm
	  (C++23)			      (function	template)
	  std::swap(std::basic_ispanstream)    specializes the std::swap algo-
       rithm
	  (C++23)			      (function	template)
	  std::swap(std::basic_ospanstream)   specializes the std::swap	 algo-
       rithm
	  (C++23)			      (function	template)
	  std::swap(std::basic_spanstream)     specializes the std::swap algo-
       rithm
	  (C++23)			      (function	template)
	  std::swap(std::basic_regex)	      specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::match_results)	       specializes the std::swap algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::thread)	      specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function)
	  std::swap(std::unique_lock)	       specialization of std::swap for
       unique_lock
	  (C++11)			      (function	template)
	  std::swap(std::promise)	      specializes the std::swap	 algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::packaged_task)	       specializes the std::swap algo-
       rithm
	  (C++11)			      (function	template)
	  std::swap(std::optional)	      specializes the std::swap	 algo-
       rithm
	  (C++17)			      (function	template)
	  std::swap(std::any)		       specializes the std::swap algo-
       rithm
	  (C++17)			      (function)
	  std::swap(std::variant)	      specializes the std::swap	 algo-
       rithm
	  (C++17)			      (function	template)
	  swap(std::filesystem::path)	      swaps two	paths
	  (C++17)			      (function)

Example
       // Run this code

	#include <algorithm>
	#include <iostream>

	namespace Ns {
	class A	{
	    int	id{};

	    friend void	swap(A&	lhs, A&	rhs) {
		std::cout << "swap(" <<	lhs << ", " << rhs << ")\n";
		std::swap(lhs.id, rhs.id);
	    }

	    friend std::ostream& operator<< (std::ostream& os, A const&	a) {
		return os << "A::id=" << a.id;
	    }

	public:
	    A(int i) : id{i} { }
	    A(A	const&)	= delete;
	    A& operator	= (A const&) = delete;
	};
	}

	int main()
	{
	    int	a = 5, b = 3;
	    std::cout << a << '	' << b << '\n';
	    std::swap(a,b);
	    std::cout << a << '	' << b << '\n';

	    Ns::A p{6},	q{9};
	    std::cout << p << '	' << q << '\n';
	//  std::swap(p, q);  // error,	type requirements are not satisfied
	    swap(p, q);	 // OK,	ADL finds the appropriate friend `swap`
	    std::cout << p << '	' << q << '\n';
	}

Output:
	5 3
	3 5
	A::id=6	A::id=9
	swap(A::id=6, A::id=9)
	A::id=9	A::id=6

	 Defect	reports

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

	     DR	      Applied	 to		    Behavior	as   published
       Correct behavior
	  LWG 2554 C++11      swapping multi-dimensional arrays	can  never  be
       made to work
			      noexcept due to name lookup problems

See also
	  ranges::swap swaps the values	of two objects
	  (C++20)      (customization point object)
	  iter_swap    swaps the elements pointed to by	two iterators
		       (function template)
	  swap_ranges  swaps two ranges	of elements
		       (function template)
	  exchange	replaces the argument with a new value and returns its
       previous	value
	  (C++14)      (function template)

http://cppreference.com		  2022.07.31			  std::swap(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::swap&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help