STL的pair学习, map学习
http://blog.csdn.net/calvin_zcx/article/details/6072286
http://www.linuxidc.com/Linux/2014-10/107621.htm
头文件 : <utility>
pair 的 <、>、<=、>=、==、!= 的比较规则 : 先比较first,first相等时再比较second (可以通过重载这几个运算符来重新指定自己的比较逻辑)
pair的初始化: pair<string, int> prt; pair<string, int>pr2("hello", 5); pair<string, int> pr3 = make_pair<string, int>("haha", 4); pair<stirng, int>pr4 = make_pair("lll",3);
pair和vector交互: pair<string, vector<int>> student;
pair访问元素: pair<int, int> a(1,2);
cout<<"first="<<a.first<<"------"<<"second="<<a.second;
pair使用typedef技巧: typedef pair<string, int> nameInfo;
nameInfo info("lucy", 4);
pair与标准输入流: pair<string, string> input;
while(cin>>input.first>>input.second){ cout<<"info is"<<input.first<<":"<<input.second<<endl;}
(abc[enter]d---->info is abc:d)
pair的隐式转换: pair可以接受隐式的类型转换,这样可以获得更高的灵活度。但是这样会出现如下问题:例如有如下两个定义:
pair<int, float>(1, 1.1);
make_pair(1, 1.1); make_pair函数会将second变量都转换成double类型.这个问题在编程是需要引起注意。
make_pair<int, float>(1,1.1); 如果想指定是float的可以像这样指明类型.
vector套用pair的一个小例子:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
继续学习map
http://www.360doc.com/content/12/0417/16/3349869_204420932.shtml
http://www.cnblogs.com/kevintian/articles/1277700.html
map的介绍
首先是map的模板头的学习
map内部存储机制实际是以红黑树为基础,红黑树在插入节点时,必须依照大小比对之后在一个合适的位置上执行插入动作。所以作为关键字,起码必须有“<”这个比较操作符。我们知道,int,float,enum,size_t等等简单关键字,都有内置的比较函数,与map搭配无论是插入还是查找,都没什么问题。但是作为复杂数据类型,如果没有明确定义“<”比较操作符,就不能与map直接搭配使用,除非我们自己定义第三个参数。
在选择map的关键字时,注意以下两点,同时这两点也是改错的方法:
a) 关键字明确定义“<”比较操作符
b) 没有“<”比较操作符,自定义仿函数替代第三个参数Compare,该仿函数实现“()”操作符,提供比较功能。插入时各节点顺序以该仿函数为纲。
如果TwoNum类提供了 bool operator < (const TwoNum& a) 函数的话,可以不用定义Compare类.main里面的map在声明myMap的时候可以写成 map<TwoNum, int> . 而如果TwoNum类没提供对于<运算符的重载的话,那么必须提供一个类,这个类里面重载了()运算符.而()运算符负责对TwoNum进行比较.
但是单纯的重载<符合是错误的.例如下例:
接来下学习一下map增加元素:
(1). 用insert函数插入pair数据 |
1 map<int, string> mapStu; 2 mapStu.insert(pair<int, string>(1,"student_lilei")); 3 mapStu.insert(pair<int, string>(2, "student_zhanffei")); |
第一种方法和第二种方法效果上完全相同. 用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念, 即当map中有这个关键字时,insert操作是插入数据不了的,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值. 用程序说明: mapStudent.insert(map<int, string>::value_type (1, "student_one")); mapStudent.insert(map<int, string>::value_type (1, "student_two")); 上面这两条语句执行后,map中1这个关键字对应的值是“student_one”,第二条语句并没有生效, 那么这就涉及到我们怎么知道insert语句是否插入成功的问题了,可以用pair来获得是否插入成功,程序如下 pair<map<int, string>::iterator, bool> Insert_Pair; Insert_Pair = mapStudent.insert(map<int, string>::value_type (1, "student_one")); 我们通过pair的第二个变量来知道是否插入成功,它的第一个变量返回的是一个map的迭代器,如果插入成功的话Insert_Pair.second应该是true的,否则为false。 |
(2).用insert函数插入value_type数据 ( |
1 map<int, string> mapStu; 2 mapStu.insert(map<int, string>::value_type(1,"stu_lilei")); 3 mapStu.insert(map<int, string>::value_type(2,"stu_lucy")); |
|
3).用数组方式插入数据 |
1 map<int, string> mapStu; 2 mapStu[1] = "stu_lilei"; 3 mapStu[2] = "stu_lucy"; |
//注意 用 下标的方式[]插入的的时候如果这个key不存在,那么会经历的步骤是 //1.创建key和key对应的空的value //2.把真正的value赋值给这个key class A { public: A(){} int i = 0; };A a; a.i = 3; map[1] = a;上面的具体过程是 (1) 1不在map中 创建一个 1:A() {注意空的A对象} (2) 1在map中了 把a赋值给key是1的value 这样就存在一个性能问题 因为你是先构建A()然后再做了一次赋值,这样的结果是如果类对象比较复杂的话,性能就不如用insert好了..切记注意啊.
写个小例子:
继续深入的学习map
http://blog.csdn.net/zhoujiaxq/article/details/9786551
映射和多重映射基于某一类型Key的键集的存在,提供对T类型的数据进行快速和高效的检索。对map而言,键只是指存储在容器中的某一成员。Map不支持副本键,multimap支持副本键。Map和multimap对象包涵了键和各个键有关的值,键和值的数据类型是不相同的,这与set不同。set中的key和value是Key类型的,而map中的key和value是一个pair结构中的两个分量。
map的构造函数
1 Template<class T1, class T2> 2 map(); //默认构造函数 3 map(const map& m); //拷贝构造函数 4 map(iterator begin, iterator end); //区间构造函数 5 map(iterator begin, iterator end, const traits& _compare); //带比较谓词的构造函数 6 map(iterator begin, iterator end, const traits& _compare, const allocator& all); //带分配器
map的嵌套定义
map<string, map<string, long> > //注意,最后的两个>直接有个空格
map的访问
map支持下标运算符operator[], 可以用访问普通数组的方式来访问map,但是[]里面的值不能是下标0,1,2,3,4而是key值 : value = map[key]
查找并获取map中元素
(1)直接用key获取 value = map[key] . 这样做的风险是:如果这个key不存在的话,会自动插入一个实力,value值为初始化值
(2)使用find()或者count()方法来探视某个key是否存在
1 if (map.find(key) != map.end()) 2 3 { 4 cout<<''找到啦"<<end; 5 }
从map中删除元素
1 //删除某个key-value 2 iterator erase(iterator it); 3 size_type erase(const Key& key); 4 iterator erase(iterator first, iterator last); 5 6 //删除所有元素 7 clear(); 8 map.erase(map.begin(), map.end());
map中swap的用法
1 //map中的swap不是一个容器中的元素交换,而是两个容器交换 2 3 #include <map> 4 #include <iostream> 5 using namespace std; 6 int main(int argc, char** argv) 7 { 8 map<int, int> m1, m2; 9 map<int, int>::iterator iter; 10 m1.insert(pair<int,int>(1,10)); 11 12 m1[2] = 20; 13 m1.insert(make_pair<int, int>(3,30)); 14 m1.insert(make_pair(4,40)); 15 16 m2[10] = 100; 17 m2[20] = 200; 18 19 m1.swap(m2); 20 21 cout<<"new m1:"<<endl<<endl; 22 for (iter = m1.begin(); iter != m1.end(); iter++) 23 { 24 cout<<iter->first<<":"<<iter->second<<endl; 25 } 26 27 cout<<"new m2:"<<endl; 28 for (iter = m2.begin(); iter != m2.end(); iter++) 29 { 30 cout<<iter->first<<":"<<iter->second<<endl; 31 } 32 return 0; 33 }
map按照value进行排序的sort问题 http://blog.csdn.net/flybywind/article/details/7536311
我们知道对map用key进行排序的话比较容易,但是如果碰到了需要对map按照value进行排序的时候怎么办么?
1 //STL的sort函数原型 2 #include <algorithm> 3 using namespace std; 4 5 template <class RandomAccessIterator> 6 void sort (RandomAccessIterator first, RandomAccessIterator last); 7 8 template <class RandomAccessIterator, class Compare> 9 void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
显然sort函数需要一个随机迭代器, 而这对于map对象来说是不可能的.所以我们必须把key-value抽取出来,放到一个vector对象里才行.
1 #include<algorithm> 2 #include<iostream> 3 #include<map> 4 #include<vector> 5 #include<utility> 6 7 using namespace std; 8 9 typedef pair<int, int> key_value; 10 11 bool comp(key_value pair1, key_value pair2) 12 { 13 return pair1.second < pair2.second; 14 } 15 16 void printVec( key_value pair1) 17 { 18 cout<<pair1.first<<":"<<pair1.second<<endl; 19 } 20 21 int main() 22 { 23 map< int, int, std::less<int> > test; 24 test[1] = 1; 25 test[2] = 3; 26 test[3] = 2; 27 test[4] = 4; 28 test[5] = 5; 29 30 vector<key_value> key_values; 31 for (auto iter = test.rbegin(); iter != test.rend(); iter++) 32 { 33 int key = iter->first; 34 int value = iter->second; 35 //key_values.push_back( make_pair<int,int>(key, value) ); 36 key_values.push_back( make_pair(key, value) ); 37 } 38 39 cout<<"before sort"<<endl; 40 for_each(key_values.begin(), key_values.end(), printVec); 41 42 sort(key_values.begin(), key_values.end(), comp); 43 44 cout<<"after sort"<<endl; 45 for_each(key_values.begin(), key_values.end(), printVec); 46 47 return 0; 48 }
转载于:https://www.cnblogs.com/silentNight/p/5575622.html
STL的pair学习, map学习相关推荐
- Java学习笔记-Pair和Map
pair用法:介绍java中Pair_梦想画家的博客-CSDN博客_java pair 共通点:Pair和Map都是以key,value进行存储 不同点: Pair通过getKey()/getValu ...
- 深度学习: mAP (Mean Average Precision)
原文:http://blog.csdn.net/jningwei/article/details/78955536 深度学习: mAP (Mean Average Precision) 版权声明:转载 ...
- 《STL源码剖析》学习--6章--_rotate算法分析
最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. <STL源码剖析>学习--6章--random access ite ...
- STL中的模板类pair 和map http://blog.csdn.net/calvin_zcx/article/details/6072286
STL中的模板类pair 和map 分类: 我的c++心得2010-12-13 00:45 5237人阅读 评论(0) 收藏 举报 pairiostreamiteratorstringfloatbas ...
- 李洪义机器学习课程(一)——Learning Map学习笔记
我们先一张一张PPT来分析讲解[1]. 总体框图 : 这张图表明了接下来的知识脉络体系,也可以看成目前学术界.工业界的几大研究方向.整体上分为: 监督学习.半监督学习.无监督学习.迁移学习.强化学习. ...
- Deep Learning(深度学习)学习笔记整理(二)
本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流 [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之: ...
- 强化学习q学习求最值_通过Q学习更深入地学习强化学习
强化学习q学习求最值 by Thomas Simonini 通过托马斯·西蒙尼(Thomas Simonini) 通过Q学习更深入地学习强化学习 (Diving deeper into Reinfor ...
- 深度学习去燥学习编码_通过编码学习编码
深度学习去燥学习编码 "Teach Yourself to program in 10 years." That's how Peter Norvig - a Berkeley p ...
- 《神经网络与深度学习》—学习笔记
[nndl.github.io] [神经网络与深度学习] [nndl-book] 深度学习基础 深度学习是机器学习的一个分支,是指一类问题以及解决这类问题的方法. 深度学习问题是一个机器学习问题,指从 ...
最新文章
- python get方法请求参数_python中requests库get方法带参数请求
- Pandas简明教程:八、Pandas数据透视表
- Redis源码剖析(一)服务器与客户端交互流程
- linux移植wifi sd8688.bin 最新固件,[ZZ]浅析firmware完整生存和使用流程
- .Net缓存小结(中)
- 详解-制作根文件系统,并使用yaffs,jffs,nfs挂载系统(2)
- Linux 内核自旋锁
- Web前端笔记-解决Vue编写的输入框(input、textarea等)使用JS设置value时提交表单无效的问题
- Pr 2021快速入门教程,素材的导入与管理
- pandas获取全部列名_Pandas 整理列名
- 计算机rapter 流程图,Raptor设计程序流程图并运行的具体操作步骤
- 电脑如何接受邮件服务器,如何设置邮箱服务器?IMAP、POP3有何区别?
- python中如何判断词性_python进行词性分析
- linux下木马程序病原体的制作和运行
- CY5-N-羟基琥珀酰亚胺|cas146368-14-1|荧光量子产率
- 局部加权回归Loess对比MFCC三角滤波(吴恩达机器学习中说,Loess算法用到了aircraft的自动驾驶中)
- iconfont用在placeholder里
- [kubernetes]-通过initcontainer监控job是否完成
- 动态修改webservices地址 地址重载
- 森林火灾算法c语言,森林火灾的卫星监测是通过()监测来实现。
热门文章
- c++ const 关键字 学习笔记
- System.Object 基类
- CCNA配置试验之三 EIGRP协议的配置
- Dreamweaver 8的后台文件传输
- DSP编程技巧---C/C++与汇编语言的交互之-使用编译器的内联函数
- 西安建筑大学电子计算机专业,西安建筑科技大学的计算机专业考研一般多少分比较有把握?...
- python从list列表中选出一个数和其对应的坐标
- leetcode算法第7题
- 从源码分析DEARGUI之add_progress_bar
- 原来matplotlib 散点图可以这样