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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::map::map - std::map::map

Synopsis
	  map();					   (1)
	  explicit map(	const Compare& comp,		   (2)
	  const	Allocator& alloc = Allocator() );
	  explicit map(	const Allocator& alloc );	   (3)	(since C++11)
	  template< class InputIt >

	  map( InputIt first, InputIt last,		   (4)
	  const	Compare& comp =	Compare(),

	  const	Allocator& alloc = Allocator() );
	  template< class InputIt >

	  map( InputIt first, InputIt last,		   (5)	(since C++14)

	  const	Allocator& alloc );
	  map( const map& other	);			   (6)
	  map( const map& other, const Allocator& alloc	); (7)	(since C++11)
	  map( map&& other );				   (8)	(since C++11)
	  map( map&& other, const Allocator& alloc );	   (9)	(since C++11)
	  map( std::initializer_list<value_type> init,

	  const	Compare& comp =	Compare(),		   (10)	(since C++11)

	  const	Allocator& alloc = Allocator() );
	  map( std::initializer_list<value_type> init,	   (11)	(since C++14)
	  const	Allocator& );

	  Constructs  new container from a variety of data sources and option-
       ally using user
	  supplied allocator alloc or comparison function object comp.

	  1-3) Constructs an empty container.
	  4-5) Constructs the container	with the contents of the range [first,
       last). If
	  multiple elements in the range have keys that	compare	equivalent, it
       is unspecified
	  which	element	is inserted (pending LWG2844).
	  6-7) Copy constructor. Constructs the	container with the copy	of the
       contents	of
	  other.

	  If  alloc  is	 not  provided,	 allocator  is	obtained  by   calling
       (since
	  std::allocator_traits<allocator_type>::select_on_container_copy_con-
       struction( C++11)
	  other.get_allocator()).
	  The  template	parameter Allocator is only deduced from the first ar-
       gument	   (since
	  while	   used	   in	 class	  template     argument	    deduction.
       C++23)

	  8-9) Move constructor. Constructs the	container with the contents of
       other using
	  move	semantics.  If alloc is	not provided, allocator	is obtained by
       move-construction
	  from the allocator belonging to other.

	  The template parameter Allocator is  only  deduced  from  the	 first
       (since C++23)
	  argument while used in class template	argument deduction.

	  10-11) Constructs the	container with the contents of the initializer
       list init. If
	  multiple elements in the range have keys that	compare	equivalent, it
       is unspecified
	  which	element	is inserted (pending LWG2844).

Parameters
	  alloc	       -  allocator  to	use for	all memory allocations of this
       container
	  comp	      -	comparison function object to use for all  comparisons
       of keys
	  first, last -	the range to copy the elements from
	  other	       -  another container to be used as source to initialize
       the elements of
			the container with
	  init	      -	initializer list to initialize	the  elements  of  the
       container with

Type requirements
	  -
	  InputIt must meet the	requirements of	LegacyInputIterator.
	  -
	  Compare must meet the	requirements of	Compare.
	  -
	  Allocator must meet the requirements of Allocator.

Complexity
	  1-3) Constant
	  4-5)	N log(N) where N = std::distance(first,	last) in general, lin-
       ear in N	if the
	  range	is already sorted by value_comp().
	  6-7) Linear in size of other
	  8-9) Constant. If alloc is given and alloc !=	other.get_allocator(),
       then linear.
	  10-11) N log(N) where	N = init.size()	in general,  linear  in	 N  if
       init is already
	  sorted by value_comp().

Exceptions
	  Calls	to Allocator::allocate may throw.

Notes
	  After	 container  move  construction	(overload  (8-9)), references,
       pointers, and
	  iterators (other than	the end	iterator) to other remain  valid,  but
       refer to	elements
	  that are now in *this. The current standard makes this guarantee via
       the blanket
	  statement  in	[container.requirements.general]/12, and a more	direct
       guarantee is
	  under	consideration via LWG 2321.

	  Although not formally	required until C++23, some implementations has
       already put the
	  template parameter Allocator into non-deduced	 contexts  in  earlier
       modes.

Example
       // Run this code

	#include <iomanip>
	#include <iostream>
	#include <string>
	#include <map>

	template<typename Key, typename	Value>
	std::ostream& operator<<(std::ostream& os, std::map<Key, Value>	const&
       m)
	{
	   os << "{ ";
	   for(auto const& p: m)
		os << '(' << p.first <<	':' << p.second	<< ") ";
	   return os <<	"}\n";
	}

	struct Point { double x, y; };
	struct PointCmp	{
	    bool operator()(const Point& lhs, const Point& rhs)	const {
		return lhs.x < rhs.x; // NB. intentionally ignores y
	    }
	};

	int main()
	{
	  // (1) Default constructor
	  std::map<std::string,	int> map1;
	  map1["something"] = 69;
	  map1["anything"] = 199;
	  map1["that thing"] = 50;
	  std::cout << "map1 = " << map1;

	  // (4) Range constructor
	  std::map<std::string,	int> iter(map1.find("anything"), map1.end());
	  std::cout << "\niter = " << iter;
	  std::cout << "map1 = " << map1;

	  // (6) Copy constructor
	  std::map<std::string,	int> copied(map1);
	  std::cout << "\ncopied = " <<	copied;
	  std::cout << "map1 = " << map1;

	  // (8) Move constructor
	  std::map<std::string,	int> moved{std::move(map1)};
	  std::cout << "\nmoved	= " << moved;
	  std::cout << "map1 = " << map1;

	  // (10) Initializer list constructor
	  const	std::map<std::string, int> init	{
	    {"this", 100},
	    {"can", 100},
	    {"be", 100},
	    {"const", 100},
	  };
	  std::cout << "\ninit = " << init;

	  std::cout << "\nCustom Key class option 1:\n";
	  // Use a comparison struct
	  std::map<Point, double, PointCmp> mag	= {
	      {	{5, -12}, 13 },
	      {	{3, 4},	  5 },
	      {	{-8, -15}, 17 }
	  };

	  for(auto p : mag)
	      std::cout	<< "The	magnitude of ("	<< p.first.x
			<< ", "	<< p.first.y <<	") is "
			<< p.second << '\n';

	  std::cout << "\nCustom Key class option 2:\n";
	  // Use a comparison lambda
	  //  This  lambda  sorts  points according to their magnitudes, where
       note that
	  //  these magnitudes are taken from the local	variable mag
	  auto cmpLambda = [&mag](const	Point &lhs, const Point	&rhs) {
	      return mag[lhs] <	mag[rhs];
	  };
	  // You could also use	a lambda that is not dependent on local	 vari-
       ables, like this:
	  //  auto cmpLambda = [](const	Point &lhs, const Point	&rhs) {	return
       lhs.y < rhs.y; };
	  std::map<Point, double, decltype(cmpLambda)> magy(cmpLambda);

	  // Various ways of inserting elements:
	  magy.insert(std::pair<Point, double>({5, -12}, 13));
	  magy.insert({	{3, 4},	5});
	  magy.insert({Point{-8.0, -15.0}, 17});

	  for(auto p : magy)
	      std::cout	<< "The	magnitude of ("	<< p.first.x
			<< ", "	<< p.first.y <<	") is "
			<< p.second << '\n';
	}

Output:
	map1 = { (anything:199)	(something:69) (that thing:50) }

	iter = { (anything:199)	(something:69) (that thing:50) }
	map1 = { (anything:199)	(something:69) (that thing:50) }

	copied = { (anything:199) (something:69) (that thing:50) }
	map1 = { (anything:199)	(something:69) (that thing:50) }

	moved =	{ (anything:199) (something:69)	(that thing:50)	}
	map1 = { }

	init = { (be:100) (can:100) (const:100)	(this:100) }

	Custom Key class option	1:
	The magnitude of (-8, -15) is 17
	The magnitude of (3, 4)	is 5
	The magnitude of (5, -12) is 13

	Custom Key class option	2:
	The magnitude of (3, 4)	is 5
	The magnitude of (5, -12) is 13
	The magnitude of (-8, -15) is 17

	 Defect	reports

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

	     DR	   Applied to	     Behavior as published	  Correct  be-
       havior
	  LWG 2193 C++11      the default constructor is explicit made non-ex-
       plicit

See also
	  operator= assigns values to the container
		    (public member function)

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

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

home | help