标签:等于 ace pair ring r++ const cat tag val
有关C++ STL的使用的一些注意点。
map在STL中定义为:
template < class Key, // map::key_type class T, // map::mapped_type class Compare = less<Key>, // map::key_compare class Alloc = allocator<pair<const Key,T> > // map::allocator_type > class map;
对于一般的使用来说,map<class key, class T>即可。但是对于key无法直接比较大小时,则需要对key类型重载<等操作符。详细代码如下:
#include<map> #include<string> #include<iostream> using 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() { //用学生信息映射分数 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; }
重载操作符时,注意一般应用const修饰,一个比较浅显的原因是,const对象只能调用const成员函数,对于可以比较的类来说,const对象当然也能够比较大小,因此某种程度上,不修改对象的函数都可以加上const。
上述代码中,tagStudentInfo类型的结构体无法直接比较大小,因此如果不重载小于<操作符,那么插入map的时候无法根据tagStudentInfo来判断是否相等或比较大小(C++中使用严格弱排序,即不允许a<b和b<a同时成立,而且等于是通过!(a<b)&&!(b<a) 来进行),编译器会对这种行对报错。
另一种解决办法,则是在map声明中加入第三个参数class Compare: map<class Key, class T, class Compare>,定义一个compare类,内部重载定义public的()操作符,用来比较大小,代码如下:
#include<map> #include<string> using namespace std; typedef struct tagStudentInfo { int nID; string strName; }StudentInfo, *PStudentInfo; //学生信息 class compare { 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() { //用学生信息映射分数 map<StudentInfo, int, compare> mapStudent; 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)); }
map成员函数的返回值也需要注意。
1. insert()函数:返回由map<class key, class T>::iterator和bool类型组成的pair,即:
map<class key, class T> mp; pair<map<class key, class T>, bool> insert_itor = mp.insert(value_type(class key, class T)(key, T))
如插入成功,则返回插入的位置和true;若插入失败,则返回冲突的位置和false。
2. upper_bound(n)和lower_bound(n)函数:返回map<class key, class T>::iterator类型的迭代器,lower_bound(n)返回大于等于n的key位置的迭代器,upper_bound(n)返回大于n的key的位置的迭代器。equal_range()则返回一个由两个map<class key, class T>::iterator类型组成的pair,前者为lower_bound(n)的返回值,后者为upper_bound(n)的返回值。如果n不存在于map中,则equal_range()返回值的first和second()相等,这也可以用来判断元素是否存在于map中。
(上述代码来源于sunshinewave)
(持续更新)
标签:等于 ace pair ring r++ const cat tag val
原文地址:http://www.cnblogs.com/MetaSiBaL/p/6687339.html