STL的map常用操作
map中的构造函数
123456789map(); // 默认构造函数map(const map& m) // 拷贝构造函数map(iterator begin, iterator end ); //区间构造函数map(iterator begin, iterator end, const traits& _compare) //带比较谓词的构造函数map(iterator begin, iterator end, const traits& _compare, const allocator& all) //带分配器数据的插入
12345678910111213141516using namespace std;int main(){map<int, string> mapStudent;mapStudent.insert(pair<int, string>(1, "student_one"));mapStudent.insert(pair<int, string>(2, "student_two"));mapStudent.insert(pair<int, string>(3, "student_three"));map<int, string>::iterator iter;for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++){cout<<iter->first<<” ”<<iter->second<<end;}}
第二种插入value_type数据
第三种:用数组方式插入数据,下面举例说明
我们可以用pair来获得是否插入成功:
数据的查找(包括判定这个关键字是否在map中出现)
在这里我们将体会,map在数据插入时保证有序的好处。
要判定一个数据(关键字)是否在map中出现的方法比较多,这里标题虽然是数据的查找,在这里将穿插着大量的
map基本用法。
这里给出两种数据查找方法
第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系
,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了
第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,
如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器,程序说明123456789101112131415161718192021using namespace std;int main(){map<int, string> mapStudent;mapStudent.insert(pair<int, string>(1, “student_one”));mapStudent.insert(pair<int, string>(2, “student_two”));mapStudent.insert(pair<int, string>(3, “student_three”));map<int, string>::iterator iter;iter = mapStudent.find(1);if(iter != mapStudent.end()){Cout<<”Find, the value is ”<<iter->second<<endl;}else{Cout<<”Do not Find”<<endl;}}数据的删除
这里要用到erase函数,它有三个重载了的函数,下面在例子中详细说明它们的用法
- 排序
这里要讲的是一点比较高深的用法了,排序问题,STL中默认是采用小于号来排序的,以上代码在排序上是不存在任
何问题的,因为上面的关键字是int型,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及
到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去。
第一种:小于号重载,程序举例12345678910111213141516171819202122232425262728293031Using namespace std;Typedef struct tagStudentInfo{Int nID;String strName;Bool operator < (tagStudentInfo const& _A) const{//这个函数指定排序策略,按nID排序,如果nID相等的话,按strName排序If(nID < _A.nID) return true;If(nID == _A.nID) return strName.compare(_A.strName) < 0;Return false;}}StudentInfo, *PStudentInfo; //学生信息Int main(){int nSize;//用学生信息映射分数map<StudentInfo, int>mapStudent;map<StudentInfo, int>::iterator iter;StudentInfo studentInfo;studentInfo.nID = 1;studentInfo.strName = “student_one”;mapStudent.insert(pair<StudentInfo, int>(studentInfo, 90));studentInfo.nID = 2;studentInfo.strName = “student_two”;mapStudent.insert(pair<StudentInfo, int>(studentInfo, 80));for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)cout<<iter->first.nID<<endl<<iter->first.strName<<endl<<iter->second<<endl;}