STL map
感谢http://www.cnblogs.com/fnlingnzb-learner/p/5833051.html
的详细说明
这里进行整理删减
map的构造函数
这里要说下的就是,我们通常用如下方法构造一个map:
1 map<int, string> mapStudent;
数据的插入
在构造map容器后,我们就可以往里面插入数据了。这里讲种最常用插入数据的方法:
用数组方式插入数据,下面举例说明:
1 map<int, string> mapStudent; 2 mapStudent[1] = "student_one"; 3 mapStudent[2] = "student_two"; 4 mapStudent[3] = "student_three";
用数组方式,它可以覆盖以前该关键字对 应的值
map的大小
在往map里面插入了数据,我们怎么知道当前已经插入了多少数据呢,可以用size函数,用法如下:
1 Int nSize = mapStudent.size();
数据的遍历
这里也提供三种方法,对map进行遍历
第一种:应用前向迭代器,上面举例程序中到处都是了
1 map<int, string>::iterator iter; 2 for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++) 3 cout<<iter->first<<' '<<iter->second<<endl;
第二种:应用反相迭代器,下面举例说明,要体会效果,请自个动手运行程序
1 map<int, string>::reverse_iterator iter; 2 for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++) 3 cout<<iter->first<<" "<<iter->second<<endl;
第三种,用数组的形式,程序说明如下:
1 int nSize = mapStudent.size(); 2 //此处应注意,应该是 for(int nindex = 1; nindex <= nSize; nindex++) 3 //而不是 for(int nindex = 0; nindex < nSize; nindex++) 4 for(int nindex = 1; nindex <= nSize; nindex++) 5 cout<<mapStudent[nindex]<<endl;
查找并获取map中的元素
这里给出三种数据查找方法
第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了
第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,
分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.
1 map<int, string>::iterator iter; 2 iter = mapStudent.find(1); 3 if(iter != mapStudent.end()) 4 cout<<"Find, the value is "<<iter->second<<endl; 5 else 6 cout<<"Do not Find"<<endl;
第三种:这个方法用来判定数据是否出现,是显得笨了点,但是,我打算在这里讲解
lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)
upper_bound函数用法,这个函数用来返回要查找关键字的上界(是一个迭代器)
例如:map中已经插入了1,2,3,4的话,如果lower_bound(2)的话,返回的2,而upper-bound(2)的话,返回的就是3
1 map<int, string>::iterator iter; 2 iter = mapStudent.lower_bound(1); 3 //返回的是下界1的迭代器 4 cout<<iter->second<<endl;
从map中删除元素
移除某个map中某个条目用erase()
该成员方法的定义如下:
iterator erase(iterator it);//通过一个条目对象删除
iterator erase(iterator first,iterator last)//删除一个范围
clear()就相当于enumMap.erase(enumMap.begin(),enumMap.end());
1 //如果要删除1,用迭代器删除 2 map<int, string>::iterator iter; 3 iter = mapStudent.find(1); 4 mapStudent.erase(iter); 5 //如果要删除1,用关键字删除 6 int n = mapStudent.erase(1);//如果删除了会返回1,否则返回0 7 //用迭代器,成片的删除 8 //一下代码把整个map清空 9 mapStudent.erase( mapStudent.begin(), mapStudent.end() ); 10 //成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合
map的基本操作函数:
1 begin() 返回指向map头部的迭代器 2 clear() 删除所有元素 3 count() 返回指定元素出现的次数 4 empty() 如果map为空则返回true 5 end() 返回指向map末尾的迭代器 6 erase() 删除一个元素 7 find() 查找一个元素 8 insert() 插入元素 9 size() 返回map中元素的个数
1 rbegin()--返回指向集合中最后一个元素的反向迭代器 2 rend()--返回指向集合中第一个元素的反向迭代器