博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
stl之map容器的原理及应用
阅读量:6580 次
发布时间:2019-06-24

本文共 3853 字,大约阅读时间需要 12 分钟。

 

容器的数据结构同样是采用红黑树进行管理,插入的元素健位不允许重复,所使用的节点元素的比较函数,只对元素的健值进行比较,元素的各项数据可通过健值检索出来。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容器对象。

 

1 #include 
2 #include
3 using namespace std; 4 struct classcomp { 5 bool operator() (const char& lhs, const char& rhs) const 6 {
return lhs
first;12 map
fourth; 13 map
third (second);14 map
second (first.begin(),first.end()); 15 return 0;16 }

 

元素的插入

除可使用如下的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容器中。

1 //"[]"2 map
mymap;3 mymap['a']="an element";4 mymap['b']="another element";5 mymap['c']=mymap['b'];
1 // map::insert 2 #include 
3 #include
4 using namespace std; 5 int main () 6 { 7 map
mymap; 8 //insert函数版本 9 mymap.insert ( pair
('a',100) );10 mymap.insert ( pair
('b',200) );11 12 pair
::iterator,bool> ret;13 ret = mymap.insert ( std::pair
('b',500) );14 if (ret.second==false) {15 cout << "元素'b' 已经存在";16 cout << " 其值为" << ret.first->second << '\n';17 }18 // insert函数版本19 map
::iterator it = mymap.begin();20 mymap.insert (it, pair
('b',300)); // 最高效的插入21 mymap.insert (it, std::pair
('c',400)); //非最高效的插入22 //insert函数版本23 map
anothermap;24 anothermap.insert(mymap.begin(),mymap.find('c'));25 //输出容器:26 cout << "mymap 包含:\n";27 for (it=mymap.begin(); it!=mymap.end(); ++it)28 cout << it->first << " => " << it->second << '\n';29 cout << "anothermap 包含:\n";30 for (it=anothermap.begin(); it!=anothermap.end(); ++it)31 cout << it->first << " => " << it->second << '\n';32 system("pause");33 return 0;34 }

元素的删除

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容器的所有元素

1 #include 
2 #include
3 using namespace std; 4 int main () 5 { 6 map
mymap; 7 map
::iterator it; 8 // 插入一些元素: 9 mymap['a']=10;10 mymap['b']=20;11 mymap['c']=30;12 mymap['d']=40;13 mymap['e']=50;14 mymap['f']=60;15 it=mymap.find('b');16 mymap.erase (it); // 删除迭代器所指元素17 mymap.erase ('c'); //删除键值为'c'的元素18 it=mymap.find ('e');19 mymap.erase ( it, mymap.end() ); //删除区间内的元素20 for (it=mymap.begin(); it!=mymap.end(); ++it)21 cout << it->first << " => " << it->second << '\n';22 return 0;23 }

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

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

转载请注明出处:,谢谢合作!

转载于:https://www.cnblogs.com/wangmengmeng/p/4873683.html

你可能感兴趣的文章
[Angularjs]系列——学习与实践
查看>>
js -- canvas img 封装
查看>>
转 我们工作的动力是什么 工作最终是为了什么?
查看>>
测试一个网站的最大并发量并发数并发用户
查看>>
适配器模式(数据库方面)支持不同的数据库连接
查看>>
Jenkins(二) 安装、新建Jobs与删除及SVN配置(转)
查看>>
CF456B Fedya and Maths 找规律
查看>>
touch修改mtime和atime
查看>>
nodejs安装及windows环境配置
查看>>
转载:Beginning WF 4.0翻译——第三章(流程图工作流)
查看>>
mysql alter table
查看>>
芯片测试
查看>>
记录一次tomcat下项目没有加载成功
查看>>
在源代码中插入防止盗版代码片段的方式
查看>>
hdu 3367 Pseudoforest(最大生成树)
查看>>
Spring mvc PostgreSQL 插入timestamp和int8
查看>>
一个人,一则故事,一份情愫,一个世界……
查看>>
ffserver联合ffmpeg建立媒体服务器
查看>>
下载稻草人下来刷新+gallery
查看>>
删除浏览器浏览器删除cookie方法
查看>>