stl之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 ;
}
元素的插入
除可使用如下的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容器的原理及应用的更多相关文章
- C++ STL 中 map 容器
C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...
- STL之map容器的详解
一.关于map的介绍 map是STL的 一个容器,和set一样,map也是一种关联式容器.它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键 字的值)的数据 ...
- 使用C++STL的map容器实现一种命令映射
因为最近在练习写一个ftp的服务器,其中的命令有很多种,每个命令对应一个执行函数,能够想到的最简单的实现方式便是使用if--else匹配命令和执行对应的函数,如下所示: if(strcmp(" ...
- C++STL中map容器的说明和使用技巧(杂谈)
1.map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 2.map的功能 自 ...
- STL的map容器将第3个模板参数设为less_equal或greater_equal会怎样?
最近都在学Linux系统编程,用C就足矣,有段时间没碰C++了,于是实现些算法练手. 实现多项式乘法的时候发现有几项没有合并同类项,最终调试到这一步时发现了问题. res是map类型,用find查找k ...
- STL——序列式容器
一.容器概述与分类 1. STL容器即是将运用最广的一些数据结构实现出来.常用的数据结构有array, list, tree, stack, queue, hash table, set, map…… ...
- c++ map容器使用及问题
C++ STL库map容器一些总结,欢迎大家指正补充. map容器由两部分组成,分别为关键字(Key)和值(Value),关键字和值都可以声明为任意类型的数据,注意:关键字唯一,不能重复!使用需包含头 ...
- STL中map与hash_map容器的选择收藏
这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...
- [STL] STL各容器实现原理
STL共有六大组件1.容器 2.算法 3.迭代器 4.仿函数 6.适配器 STL容器的实现原理 STL来管理数据十分方便,省去了我们自己构建数据结构的时间.其实,STL的实现也是基于我们常见的数据结构 ...
随机推荐
- Flex发行2048游戏
近来的2048像挺火的游戏.在公交车,吃.甚至还有人走在路上拿着手机在玩.之前我看我的同事们戏,我认为这是很天真,中移动太无聊了吧 到后面,他是在,我觉得真的很无聊,这时候,无聊的时候无聊,后来我想用 ...
- JSON小结
在 JSON 中,“Object” 是什么呢? json.org 有很好的解释: 1 .An object is an unordered set of name/value pairs. 2.An ...
- 利用Eclipse中的Maven构建Web项目(三)
利用Eclipse中的Maven构建Web项目 1.将Maven Project转换成动态Web项目,鼠标右键项目,输入"Project Facets" 2.依据Dynamic W ...
- shell 脚本运算符
1.数值 格式: test "num1" opr "num2" [ "num1" opr "num2" ] opr 取值 ...
- android ListView优化
android ListView通过优化重用历史缓存实现.listview相应的数据适配器一般使用自己定义BaseAdapter子类,重用历史缓冲区来提高性能. 例如,下面的示例代码演示: 1.lis ...
- Alamofire网络库进阶教程
本章节由CocoaChina翻译组成员星夜暮晨(博客)翻译自raywenderlich:Intermediate Alamofire Tutorial,敬请勘误. 欢迎回到我们的 Alamofire ...
- Reactive ExtensionsLINQ和Rx简单介绍
LINQ和Rx简单介绍 相信大家都用过Language Integrated Query (LINQ),他是一种强大的工具能够从集合中提取数据.Reactive Extensions(Rx)是对LIN ...
- 【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象
为何将单例模式移除 在Cocos2d-JS v3.0之前.全部API差点儿都是从Cocos2d-x中移植过来的,这是Cocos2d生态圈统一性的重要一环.可惜的是,这样的统一性也在非常大程度上限制了C ...
- StackExchange.Redis 使用-发布订阅 (二)
使用Redis的发布订阅功能 redis另一个常见的用途是发布订阅功能 . 它非常的简单 ,当连接失败时 ConnectionMultiplexer 会自动重新进行订阅 . ISubscriber s ...
- mysql常见操作汇总
1.Mysql服务突然启不来了,报错: 在分析时发现MySQL Server 5.0\data下面有个名称为用户名,扩展名为.err的文件: 150725 20:01:19 [Note] 自己的安装目 ...