Map和multimap容器详细使用讲解

map/multimap的简介

map是标准的关联式容器,一个map里存储的元素是一个键值对序列,叫做(key,value)键值对。它提供基于key快速检索数据的能力。

Map和multimap容器详细使用讲解_第1张图片

  1. map中key值是唯一的。集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
  2. map底层的具体实现是采用红黑树变体的平衡二叉树的数据结构。在插入操作、删除和检索操作上比vector快很多。
  3. map可以直接存取key所对应的value,支持[]操作符,如map[key]=value。
  4. #include

multimap与map的区别

map支持唯一键值,每个键只能出现一次;而multimap中相同键可以出现多次。multimap不支持[]操作符。

map/multimap对象的默认构造

map/multimap采用模板类实现,对象的默认构造形式:
map mapTT; 
multimap  multimapTT;  
如:
map mapA;
map mapB;
其中T1,T2还可以用各种指针类型或自定义类型

map和multimap对象的带参数构造 

方式一:map(beg,end);     将(beg, end)区间中的元素拷贝给本身。
方式二:map(const map &mapObject);  拷贝构造函数。

 map的插入与迭代器

map.insert(...);    //往容器插入元素,返回pair

map中插入元素的四种方式:

假设  map mapStu;
方式一、通过pair的方式插入对象
mapStu.insert(  pair(1,"张三")  );
方式二、通过pair的方式插入对象
mapStu.inset(make_pair(2, “李四”));
方式三、通过value_type的方式插入对象
mapStu.insert(  map::value_type(3,"王五")  );
方式四、通过数组的方式插入值
mapStu[4] = "赵六";
mapStu[5] = “小七";

注意:

  1. 前三种方法,采用的是insert()方法,该方法返回值为pair
  2. 第四种方法非常直观,但碰到相同的键时会进行覆盖操作。比如插入key 为4的键值时,先在mapStu中查找主键为4的项,若不存在,则将一个键为4,值为默认初始化值的对组插入到mapStu中,然后再将值修改成“赵六”。若发现已存在4这个键,则修改这个键对应的value。
  3. string strName = mapStu[8];   //取值操作或插入操作
  4. 只有当mapStu存在8这个键时才是正确的取操作,否则会自动插入一个实例,键为8,值为默认构造时的初始化值。

 

迭代器

  1. map.begin();  //返回容器中第一个数据的迭代器。
  2. map.end();  //返回容器中最后一个数据之后的迭代器。
  3. map.rbegin();  //返回容器中倒数第一个元素的迭代器。
  4. map.rend();   //返回容器中倒数最后一个元素的后面的迭代器。
方式一  构造一个pair ,然后插入
pair::iterator,bool> ret = mapStu.insert(pair(1, "张三"));

方式二  使用make_pair 
	mapStu.insert(make_pair(2, "李四"));

方式三  使用value_type, 相当于pair
	mapStu.insert(map::value_type(3, "王五"));

方式四 直接使用[]重载,如果键值对已经存在,则覆盖原值
	mapStu[4]="张三";
	mapStu[4] = "小张三";

map/multimap 排序

  1. map >  mapA;  //该容器是按键的升序方式排列元素。未指定函数对象,默认采用less函数对象。
  2. map> mapB;   //该容器是按键的降序方式排列元素。
  3. less与greater  可以替换成其它的函数对象functor。
  4. 可编写自定义函数对象以进行自定义类型的比较,使用方法与set构造时所用的函数对象一样。

map对象的拷贝构造与赋值

map(const map &mp);		          拷贝构造函数
map& operator=(const map &mp);	  重载等号操作符
map.swap(mp);				      交换两个集合容器

例如:
		map mapA;
		mapA.insert(pair(2, "李四"));	
		mapA.insert(pair(1, "张三"));	
		mapA.insert(pair(3, "王五"));	
		mapA.insert(pair(4, "赵六"));	

		map mapB(mapA);	拷贝构造,此时mapB 和mapA中元素一致
		
		map mapC;
		mapC = mapA;			    赋值,此时mapC 和mapA中元素一致

		mapC[3] = "老张";           mapC中,此时包含 张三, 李四, 老张, 赵六
		mapC.swap(mapA);		    mapA和mapC交换

 map的大小

map.size();	    返回容器中元素的数目
map.empty();    判断容器是否为空
map mapA;
mapA.insert(pair(2, "李四"));	
mapA.insert(pair(1, "张三"));	
mapA.insert(pair(3, "王五"));	
mapA.insert(pair(4, "赵六"));	

 map的删除

map.clear();		  删除所有元素
map.erase(pos);	      删除pos迭代器所指的元素,返回下一个元素的迭代器。
map.erase(beg,end);   删除区间[beg,end)的所有元素	,返回下一个元素的迭代器。
map.erase(key);       删除容器中key为key的对组,返回删除的对组个数
Map.erase(key_type *first, key_type *last)  //删除数组指定的半闭半开的区间中特定的
key对应的所有队组


map mapA;
mapA.insert(pair(2, "李四"));	  
mapA.insert(pair(1, "张三"));	
mapA.insert(pair(3, "王五"));	
mapA.insert(pair(4, "赵六"));	

删除区间内的元素,迭代器指示区间(半闭半开)
map::iterator itBegin=mapA.begin();
++ itBegin;
map::iterator itEnd=mapA.end();
mapA.erase(itBegin,itEnd);    //此时容器mapA仅仅包含{1,"张三"}一个元素。

mapA.insert(pair(2, "李四"));	
mapA.insert(pair(3, "王五"));	
mapA.insert(pair(4, "赵六"));

删除容器中的第一个元素,使用迭代器指示位置
mapA.erase(mapA.begin());	//mapA包含{2,"李四"}{3,"王五"}{4,"赵六"}三个元素

删除容器中key为4的元素
mapA.erase(4); 
   
删除mapA的所有元素
mapA.clear();			//容器为空

 map/multimap的查找

  1. map.find(key);   查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end();
  2. map.count(key);   //返回容器中键值为key的对组个数。对map来说,要么是0,要么是1;对multimap来说,值>=0。
  3. map.lower_bound(keyElem);  //返回第一个key>=keyElem元素的迭代器。
  4. map.upper_bound(keyElem);    //  返回第一个key>keyElem元素的迭代器。
  5. map.equal_range(keyElem);         //返回容器中key与keyElem相等的上下限的两个迭代器。上限是闭区间,下限是开区间,如[beg,end)。

 

你可能感兴趣的:(笔记)