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

stl之map容器的原理及应用相关推荐

  1. C/C++语言函数学习(3)STL中map容器

    /******************************************************************map的基本操作函数:C++ Maps是一种关联式容器,包含&qu ...

  2. 转 STL hash_map map

    几句话道出map和hash_map的区别 1. STL map is an associative array where keys are stored in sorted order using ...

  3. STL中基本容器有: string、vector、list、deque、set、map

    为什么80%的码农都做不了架构师?>>>    在STL中基本容器有: string.vector.list.deque.set.map set 和map都是无序的保存元素,只能通过 ...

  4. STL标准库-容器-set与map

    STL标准库-容器-set与multiset C++的set https://www.cnblogs.com/LearningTheLoad/p/7456024.html STL标准库-容器-map和 ...

  5. c++ map 修改value_C++知识分享之STL容器:set 容器与 map 容器的简单应用

    set容器中一些函数,取自百度其他大佬已总结好的,如有侵权,请联系删除! set的各成员函数列表如下: c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器 c++ stl容 ...

  6. C++ STL学习笔记 : 2. unordered map 容器

    本文中,简单总结一下使用unordered map 的心得.unordered_map容器属于STL中关联表的一种,常用的map容器与unordered_map容器在使用中有着很大程度的相同点,在之后 ...

  7. C++知识分享之STL容器:set 容器与 map 容器的简单应用

    set容器中一些函数,取自百度其他大佬已总结好的,如有侵权,请联系删除! set的各成员函数列表如下: c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器 c++ stl容 ...

  8. C++ STL之map映照容器

    map映照容器所处理的元素数据,与数据库的具有键值的记录非常相似,由一个键值和其他若干数据(映照数据)组成,键值和映照数据之间,可建立一个数学上的映照关系,由此而得映照容器的名称.**容器的数据结构同 ...

  9. C++ map容器和multimap容器(STL map容器)

    目录 1. 关联容器和map容器概述 2. map容器 2.1 map的创建以及初始化列表 2.2 map容器的一般常用属性(方法) 2.3 插入数据 2.4 数据的访问和遍历 2.5 数据的删除 2 ...

最新文章

  1. 2021年春季学期-信号与系统-第十五次作业参考答案-第十一小题参考答案
  2. 【 FPGA 】FIR 滤波器之多相插值器(Polyphase Interpolator)
  3. iphone开发证书 纠结许久
  4. Linux-PAM PAM-MySQL的总结
  5. linux命令ssh
  6. java计算混淆矩阵(分类指标:查准率P,查全率R,P和R的调和均值F1,正确率A)
  7. IIS 指定了身份验证方案“IntegratedWindowsAuthentication, Anonymous”,但绑定仅支持一种身份验证的规范。...
  8. MMKV_微信MMKV源码分析(一) | 整体流程
  9. pyltp实体识别_哈工大 PYLTP 安装 排坑指南
  10. java return true false_javascript中return,return true,return false三者的用法及区别
  11. Qt学习之路 (一)概述
  12. 计算机的存储容量以什么为单位,计算机中用来表示内存储器容量大小的基本单位是什么?...
  13. 大型网站技术架构演进与性能优化
  14. Topaz Video Enhance Al视频无损放大软件常见问题指南
  15. php排版word文档试卷,出试卷用word怎么排版
  16. win7事件查看器事件id_使用免费工具从事件查看器中查找事件ID
  17. WinEdit如何修改字体大小
  18. win11系统下,迅雷启动后闪退的问题
  19. 阿里云服务器安装并配置nginx代理转发请求
  20. uni-app在安卓手机监听物理返回键

热门文章

  1. [Python] numpy库的简介和常用函数
  2. grafana设置mysql为数据源,并进行可视化
  3. markdown与latex:数学符号远远大于\gg和远远小于书写\ll
  4. android gradle 设置,android gradle配置指南
  5. Java入门第37课——猜字母游戏之设计数据结构
  6. [BZOJ1815BZOJ1488]有色图/图的同构(Polya定理)
  7. P4171 [JSOI2010]满汉全席
  8. PHP和javascript中url编码解码详解
  9. 最新的 iOS 申请证书与发布流程
  10. question1 赋值运算操作符