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

元素的插入

除可使用如下的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',) );
mymap.insert ( pair<char,int>('b',) ); pair<map<char,int>::iterator,bool> ret;
ret = mymap.insert ( std::pair<char,int>('b',) );
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',)); // 最高效的插入
mymap.insert (it, std::pair<char,int>('c',)); //非最高效的插入
//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 ;
}

元素的删除

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']=;
mymap['b']=;
mymap['c']=;
mymap['d']=;
mymap['e']=;
mymap['f']=;
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 ;
}

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

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

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

stl之map容器的原理及应用的更多相关文章

  1. C++ STL 中 map 容器

    C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...

  2. STL之map容器的详解

    一.关于map的介绍 map是STL的 一个容器,和set一样,map也是一种关联式容器.它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键 字的值)的数据 ...

  3. 使用C++STL的map容器实现一种命令映射

    因为最近在练习写一个ftp的服务器,其中的命令有很多种,每个命令对应一个执行函数,能够想到的最简单的实现方式便是使用if--else匹配命令和执行对应的函数,如下所示: if(strcmp(" ...

  4. C++STL中map容器的说明和使用技巧(杂谈)

    1.map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 2.map的功能 自 ...

  5. STL的map容器将第3个模板参数设为less_equal或greater_equal会怎样?

    最近都在学Linux系统编程,用C就足矣,有段时间没碰C++了,于是实现些算法练手. 实现多项式乘法的时候发现有几项没有合并同类项,最终调试到这一步时发现了问题. res是map类型,用find查找k ...

  6. STL——序列式容器

    一.容器概述与分类 1. STL容器即是将运用最广的一些数据结构实现出来.常用的数据结构有array, list, tree, stack, queue, hash table, set, map…… ...

  7. c++ map容器使用及问题

    C++ STL库map容器一些总结,欢迎大家指正补充. map容器由两部分组成,分别为关键字(Key)和值(Value),关键字和值都可以声明为任意类型的数据,注意:关键字唯一,不能重复!使用需包含头 ...

  8. STL中map与hash_map容器的选择收藏

    这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...

  9. [STL] STL各容器实现原理

    STL共有六大组件1.容器 2.算法 3.迭代器 4.仿函数 6.适配器 STL容器的实现原理 STL来管理数据十分方便,省去了我们自己构建数据结构的时间.其实,STL的实现也是基于我们常见的数据结构 ...

随机推荐

  1. Git相关操作汇总

    git clone: 正如上图,当我们打开终端的情况下,默认我们所在的目录是在/home/shiyanlou的,大家可以在终端输入以下命令把目录切换到桌面cd  /home/Desktop这个时候输入 ...

  2. c++ primer 函数传值1

    不看c++ primer  永远不知道自己基础有多差 函数的參数传值一般有两种方式:值传递,引用传递. 值传递有以下两种形式: void func( int a ) { // } void func1 ...

  3. MFC 将文件拖进对话框获得文件信息

    非常多软件都支持直接将文件拖进去进行处理的功能,详细一点如暴风影音,将视频或者音频文件拖进去就会自己主动開始播放,那么这个功能在MFC上面怎么实现的呢?事实上非常easy,过程例如以下: 第一步:将对 ...

  4. MYSQL IFNULL使用功能

    稍后的MYSQL IFNULL使用此功能的特定叙事,供大家参考学习,假设你MYSQL IFNULL条款的使用功能类别遇到似问题.最好看. MYSQL IFNULL(expr1,expr2)       ...

  5. Android - 分享内容 - 给其他APP发送内容

    创建一个intent时,必须要指定intent将要触发的操作.Android定义了很多操作,包括ACTION_SEND,就象可以猜到的一样,表示intent是把数据从一个activity发送给另一个, ...

  6. ATL 创COM物

    我原来以前写dll创建过程,而直接使用LoadLibrary加载动态库. 但ATL提出了一个非常重要的特点是引入COM对象的概念. 首先. ATL active template library该活动 ...

  7. MySQL 正則表達式搜索

    products表例如以下: 1. 基本字符匹配 使用正則表達式与LIKE的差别,正則表達式是在整个列搜索,仅仅要prod_name中包括了所搜索的字符就能够了,而LIKE假设不用通配符,那么要求pr ...

  8. robot framework 使用三:他们主动浏览器的兼容性

    robot framework 浏览器兼容性测试 上图中黄色圈的地方默认什么都不写,是firefox浏览器.写上ie就是ie浏览器了 firefox最新版本号即可,ie须要设置: 1. IE选项设置的 ...

  9. Team Foundation Server 2013 Update 3 下载激活

    http://www.microsoft.com/zh-cn/download/details.aspx?id=43728 支持的操作系统 Windows 7 Service Pack 1, Wind ...

  10. 大数据的胖哥的方式(9)- 金融业数据仓库的逻辑模型FS-LDM

    介绍: 大数据是不是海市蜃楼,来自小橡子只是意淫奥克斯,大数据的发展,而且要从头开始,基于大数据建设国家.项目-level数据中心行业将越来越多,大数据仅供技术,而非溶液,临数据组织模式,数据逻辑模式 ...