c++ map 函数

 c++   Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。   1. map的构造函数   map maphai;   map maphai;   map mapstring;   map mapstring;   mapmapint;   mapmapchar;   2. 数据的插入   在构造map容器后,我们就可以往里面插入数据了。这里讲三种插入数据的方法:   第一种:用insert函数插入pair数据,   #include   #include   #include   Using namespace std;   Int main()   {   Map mapStudent;   mapStudent.insert(pair(1, “student_one”));   mapStudent.insert(pair(2, “student_two”));   mapStudent.insert(pair(3, “student_three”));   map::iterator iter;   for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)   {   Cout<first<<” ”<second<   #include   #include   Using namespace std;   Int main()   {   Map mapStudent;   mapStudent.insert(map::value_type (1, “student_one”));   mapStudent.insert(map::value_type (2, “student_two”));   mapStudent.insert(map::value_type (3, “student_three”));   map::iterator iter;   for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)   {   Cout<first<<” ”<second<   #include   #include   Using namespace std;   Int main()   {   Map mapStudent;   mapStudent[1] = “student_one”;   mapStudent[2] = “student_two”;   mapStudent[3] = “student_three”;   map::iterator iter;   for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)   {   Cout<first<<” ”<second<::value_type (1, “student_one”));   mapStudent.insert(map::value_type (1, “student_two”));   上面这两条语句执行后,map中1这个关键字对应的值是“student_one”,第二条语句并没有生效,那么这就涉及到我们怎么知道insert语句是否插入成功的问题了,可以用pair来获得是否插入成功,程序如下   Pair::iterator, bool> Insert_Pair;   Insert_Pair = mapStudent.insert(map::value_type (1, “student_one”));   我们通过pair的第二个变量来知道是否插入成功,它的第一个变量返回的是一个map的迭代器,如果插入成功的话Insert_Pair.second应该是true的,否则为false。   下面给出完成代码,演示插入成功与否问题   #include   #include   #include   Using namespace std;   Int main()   {   Map mapStudent;   Pair::iterator, bool> Insert_Pair;   Insert_Pair = mapStudent.insert(pair(1, “student_one”));   If(Insert_Pair.second == true)   {   Cout<<”Insert Successfully”<(1, “student_two”));   If(Insert_Pair.second == true)   {   Cout<<”Insert Successfully”<::iterator iter;   for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)   {   Cout<first<<” ”<second<   #include   #include   Using namespace std;   Int main()   {   Map mapStudent;   mapStudent[1] = “student_one”;   mapStudent[1] = “student_two”;   mapStudent[2] = “student_three”;   map::iterator iter;   for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)   {   Cout<first<<” ”<second<   #include   #include   Using namespace std;   Int main()   {   Map mapStudent;   mapStudent.insert(pair(1, “student_one”));   mapStudent.insert(pair(2, “student_two”));   mapStudent.insert(pair(3, “student_three”));   map::reverse_iterator iter;   for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)   {   Cout<first<<” ”<second<   #include   #include   Using namespace std;   Int main()   {   Map mapStudent;   mapStudent.insert(pair(1, “student_one”));   mapStudent.insert(pair(2, “student_two”));   mapStudent.insert(pair(3, “student_three”));   int nSize = mapStudent.size()   //此处有误,应该是 for(int nIndex = 1; nIndex <= nSize; nIndex++)   //by rainfish   for(int nIndex = 0; nIndex < nSize; nIndex++)   {   Cout<   #include   #include   Using namespace std;   Int main()   {   Map mapStudent;   mapStudent.insert(pair(1, “student_one”));   mapStudent.insert(pair(2, “student_two”));   mapStudent.insert(pair(3, “student_three”));   map::iterator iter;   iter = mapStudent.find(1);   if(iter != mapStudent.end())   {   Cout<<”Find, the value is ”<second<   #include   #include   Using namespace std;   Int main()   {   Map mapStudent;   mapStudent[1] = “student_one”;   mapStudent[3] = “student_three”;   mapStudent[5] = “student_five”;   map::iterator iter;   iter = mapStudent.lower_bound(2);   {   //返回的是下界3的迭代器   Cout<second<second<second<second<::iterator, map::iterator> mapPair;   mapPair = mapStudent.equal_range(2);   if(mapPair.first == mapPair.second)   {   cout<<”Do not Find”<   #include   #include   Using namespace std;   Int main()   {   Map mapStudent;   mapStudent.insert(pair(1, “student_one”));   mapStudent.insert(pair(2, “student_two”));   mapStudent.insert(pair(3, “student_three”));   //如果你要演示输出效果,请选择以下的一种,你看到的效果会比较好   //如果要删除1,用迭代器删除   map::iterator iter;   iter = mapStudent.find(1);   mapStudent.erase(iter);   //如果要删除1,用关键字删除   Int n = mapStudent.erase(1);//如果删除了会返回1,否则返回0   //用迭代器,成片的删除   //一下代码把整个map清空   mapStudent.earse(mapStudent.begin(), mapStudent.end());   //成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合   //自个加上遍历代码,打印输出吧   }   8. 其他一些函数用法   这里有swap,key_comp,value_comp,get_allocator等函数,感觉到这些函数在编程用的不是很多,略过不表,有兴趣的话可以自个研究   9. 排序   这里要讲的是一点比较高深的用法了,排序问题,STL中默认是采用小于号来排序的,以上代码在排序上是不存在任何问题的,因为上面的关键字是int型,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去,下面给出两个方法解决这个问题   第一种:小于号重载,程序举例   #include   #include   Using namespace std;   Typedef struct tagStudentInfo   {   Int nID;   String strName;   }StudentInfo, *PStudentInfo; //学生信息   Int main()   {   int nSize;   //用学生信息映射分数   mapmapStudent;   map::iterator iter;   StudentInfo studentInfo;   studentInfo.nID = 1;   studentInfo.strName = “student_one”;   mapStudent.insert(pair(studentInfo, 90));   studentInfo.nID = 2;   studentInfo.strName = “student_two”;   mapStudent.insert(pair(studentInfo, 80));   for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)   cout<first.nID<first.strName<second<   #include   Using namespace std;   Typedef struct tagStudentInfo   {   Int nID;   String strName;   }StudentInfo, *PStudentInfo; //学生信息   Classs sort   {   Public:   Bool operator() (StudentInfo const &_A, StudentInfo const &_B) const   {   If(_A.nID < _B.nID) return true;   If(_A.nID == _B.nID) return _A.strName.compare(_B.strName) < 0;   Return false;   }   };   Int main()   {   //用学生信息映射分数   MapmapStudent;   StudentInfo studentInfo;   studentInfo.nID = 1;   studentInfo.strName = “student_one”;   mapStudent.insert(pair(studentInfo, 90));   studentInfo.nID = 2;   studentInfo.strName = “student_two”;   mapStudent.insert(pair(studentInfo, 80));   } 为了您的安全,请只打开来源可靠的网址 打开网站 取消 来自: http://hi.baidu.com/0wingbinging/blog/item/a3c3880578f3e9c67b89479a.html
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值