map容器的原理及应用

容器的数据结构同样是采用红黑树进行管理,插入的元素健位不允许重复,所使用的节点元素的比较函数,只对元素的健值进行比较,元素的各项数据可通过健值检索出来。map容器是一种关联容器,实现了SortedAssociative Container、Sorted Associative Container和Unique Associative Container概念的接口规范。

map技术原理

图中所示是map容器的一个元素的数据组成,可通过pair封装成一个结构对象。map容器所要做的,就是将这个pair对象插入到红黑树,完成一个元素的添加。同时,也要提供一个仅使用键值进行比较的函数对象,将它传递给红黑树。由此,就可利用红黑树的操作,将map元素数据插入到二叉树中的正确位置,也可以根据键值进行元素的删除和检索。

map应用基础

头文件:#include<map>

创建map对象

1)map(); //创建一个没有任何元素的map对象

2)map(constkey_compare& comp); //指定一个比较函数对象comp来创建map对象,内存分配器为默认值。

3)map(constmap&); //拷贝构造函数,用一个map容器的元素和比较函数,拷贝生成一个新的map容器对象。

4)map(InputIteratorfirst, InputIterator last); //用迭代器区间[first)所指的数据,作为map容器的元素(包括键值和映照数据),创建一个map容器对象。

#include <iostream>
#include <map>
using namespace std;
struct classcomp {
	bool operator() (const char& lhs, const char& rhs) const
	{return lhs<rhs;}
};
int main ()
{
	//创建map对象
	map<char,int> first;
	map<char,int,classcomp> fourth;
	map<char,int> third (second);
	map<char,int> second (first.begin(),first.end());
	return 0;
}

元素的插入

除可使用如下的insert函数,将整个元素数据进行插入外,常用map容器的数组操作"[]",显式地为不同键值赋予内容(映照数据),不过这个数组方法,不能检测是否插入成功。

1)pair<iterator,bool>insert(const value_type& v)

将元素v(包括键值和映照数据)插入map容器,重复的v值不被插入。返回一个pair配对对象,提供所插入元素的迭代器位置和true/false插入成功标志。

2)iteratorinsert(iterator position, const value type& v)

将元素v(包括键值和映照数据)插入map容器,参数position只是提示可在position位置之前插入v,所返回的插入位置视情况而定,不一定在position位置前插入。

3)voidinsert(InputIterator first, InputIterator last)

将迭代器区间[first,last)所指的数据作为容器元素(包括键值和映照数据),插入到map容器中。

//"[]"
map<char,std::string> mymap;
mymap['a']="an element";
mymap['b']="another element";
mymap['c']=mymap['b'];
// map::insert
#include <iostream>
#include <map>
using namespace std;
int main ()
{
	map<char,int> mymap;
	//insert函数版本
	mymap.insert ( pair<char,int>('a',100) );
	mymap.insert ( pair<char,int>('b',200) );

	pair<map<char,int>::iterator,bool> ret;
	ret = mymap.insert ( std::pair<char,int>('b',500) );
	if (ret.second==false) {
		cout << "元素'b' 已经存在";
		cout << " 其值为" << ret.first->second << '\n';
	}
	// insert函数版本
	map<char,int>::iterator it = mymap.begin();
	mymap.insert (it, pair<char,int>('b',300));  // 最高效的插入
	mymap.insert (it, std::pair<char,int>('c',400));  //非最高效的插入
	//insert函数版本
	map<char,int> anothermap;
	anothermap.insert(mymap.begin(),mymap.find('c'));
	//输出容器:
	cout << "mymap 包含:\n";
	for (it=mymap.begin(); it!=mymap.end(); ++it)
		cout << it->first << " => " << it->second << '\n';
	cout << "anothermap 包含:\n";
	for (it=anothermap.begin(); it!=anothermap.end(); ++it)
		cout << it->first << " => " << it->second << '\n';
	system("pause");
	return 0;
}

元素的删除

1. void erase(iteratorposition); 删除 position所指的元素

2. size_type erase(const key_type& k);  删除等于键值 k的那个元素,对于map容器来说,此函数总是返回值1,因为map容器不会出现重复的元素值(键值)

3. void erase(iterator first, iterator last); 删除map迭代器区间 [first,last)上的所有元素

4. void clear(); 删除map容器的所有元素

#include <iostream>
#include <map>
using namespace std;
int main ()
{
	map<char,int> mymap;
	map<char,int>::iterator it;
	// 插入一些元素:
	mymap['a']=10;
	mymap['b']=20;
	mymap['c']=30;
	mymap['d']=40;
	mymap['e']=50;
	mymap['f']=60;
	it=mymap.find('b');
	mymap.erase (it);                   // 删除迭代器所指元素
	mymap.erase ('c');                  //删除键值为'c'的元素
	it=mymap.find ('e');
	mymap.erase ( it, mymap.end() );    //删除区间内的元素
	for (it=mymap.begin(); it!=mymap.end(); ++it)
		cout << it->first << " => " << it->second << '\n';
	return 0;
}

其他成员函数用法与前篇set容器相似,不再赘述。

直观来说,map容器区别于set容器的一个主要特性在于,map是处理带有键值的记录型元素数据的快速插入、删除和检索,而set则可看成是对单一数据的处理。map将一个元素划分出键值部分,并按这个局部的键值制定整个元素的函数比较规则,来建立容器的数据分布。map的元素键值是唯一的,不允许重复的元素键值插入。set和map都是泛型库对二叉树的一个泛化。

转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46762505,谢谢合作!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 15:19:00

map容器的原理及应用的相关文章

stl之map容器的原理及应用

容器的数据结构同样是采用红黑树进行管理,插入的元素健位不允许重复,所使用的节点元素的比较函数,只对元素的健值进行比较,元素的各项数据可通过健值检索出来.map容器是一种关联容器,实现了SortedAssociative Container.Sorted Associative Container和Unique Associative Container概念的接口规范. map技术原理 图中所示是map容器的一个元素的数据组成,可通过pair封装成一个结构对象.map容器所要做的,就是将这个pai

STL之map容器的详解

一.关于map的介绍 map是STL的 一个容器,和set一样,map也是一种关联式容器.它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键 字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据.这里说下map内部数据的组织,map内部是自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的.学习map我们一定要理解什么是一对一的数据映射?比如:一个班级中,每个学生的学号跟他的姓名

spring容器IOC原理解析

原理简单介绍: Spring容器的原理,其实就是通过解析xml文件,或取到用户配置的bean,然后通过反射将这些bean挨个放到集合中,然后对外提供一个getBean()方法,以便我们获得这些bean.下面是一段简单的模拟代码: [java] view plain copy package com.tgb.spring.factory; import java.util.HashMap; import java.util.List; import java.util.Map; import or

hdu 4941 Magical Forest (map容器)

Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 135    Accepted Submission(s): 69 Problem Description There is a forest can be seen as N * M grid. In this forest, there is so

HDU 1113 Word Amalgamation (map 容器 + string容器)

http://acm.hdu.edu.cn/showproblem.php?pid=1113 Problem Description In millions of newspapers across the United States there is a word game called Jumble. The object of this game is to solve a riddle, but in order to find the letters that appear in th

docker容器网络通信原理分析

概述 自从docker容器出现以来,容器的网络通信就一直是大家关注的焦点,也是生产环境的迫切需求.而容器的网络通信又可以分为两大方面:单主机容器上的相互通信和跨主机的容器相互通信.而本文将分别针对这两方面,对容器的通信原理进行简单的分析,帮助大家更好地使用docker. docker单主机容器通信 基于对net namespace的控制,docker可以为在容器创建隔离的网络环境,在隔离的网络环境下,容器具有完全独立的网络栈,与宿主机隔离,也可以使容器共享主机或者其他容器的网络命名空间,基本可以

简单即用的临时Map容器(参考TimeCacheMap和RotatingMap)

因为业务需要,经常会缓存一些临时数据.比如:手机号发送验证码, 60s内同一个手机号不能重复发送验证码.查询航班信息,缓存1分钟热门查询数据.... 之前一直使用redis作为数据缓存,简单方便..但是如果是个小App,数据没有那么大,可能需要缓存的数据只有不到100KB,使用redis就大材小用 最近一个项目上线的时候,老大跟我说:真的有必要用redis么..不行就先删掉吧..自己想了下,因为App入口有两个ip,不同机器,虽然业务量不大,为了session共享,还是上了 如果只有一个入口(不

【转】C++中map容器的说明和使用技巧

C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值. 一.map的说明    1   头文件   #include   <map>     2   定义   map<string,   int>   my_Map;   或者是typedef     map<string,   int>   MY_MAP;   MY_MAP   my_Map;     3   插入数据   (1)   my_Map["

HNU 12888 Encryption(map容器)

题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12890&courseid=274 解题报告:输入一个有n个单词的句子,然后再输入这n个单词对应的意思是什么,要你翻译出这个句子最后是什么. 一个裸的map 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm>