首页 > 代码库 > C++ STL

C++ STL

有关C++ STL的使用的一些注意点。

一、map

  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

 

 

(持续更新)

C++ STL