set

当set存的是一个结构体时,若想用 find 函数,应在结构体内部写一个函数

struct node
{
    int x;
    int num;
    
    bool operator< (const node &v)const{ // 先比较 x , 若 x 相同再比较num,小的返回true
        if (x < v.x) return true;
        else if (x == v.x) {
            if (num < v.num) return true;
            else return false;
        }
        else return false;
    }
};
set<node>s, f;

 

 

#include <iostream>   
#include <set>   
using namespace std;  
   
/*Student结构体*/  
struct Student {  
    string name;  
    int age;  
    string sex;  
};  
   
/*“仿函数"。为Student set指定排序准则*/  
class studentSortCriterion {  
    public:  
        bool operator() (const Student &a, const Student &b) const {  
            /*先比较名字;若名字相同,则比较年龄。小的返回true*/  
            if(a.name < b.name)  
                return true;  
            else if(a.name == b.name) {  
                if(a.age < b.age)  
                    return true;  
                else  
                    return false;  
            } else  
                return false;  
        }  
};  
   
int main()  
{  
    set<Student, studentSortCriterion> stuSet;  
   
    Student stu1, stu2;  
    stu1.name = "张三";  
    stu1.age = 13;  
    stu1.sex = "male";  
   
    stu2.name = "李四";  
    stu2.age = 23;  
    stu2.sex = "female";  
   
    stuSet.insert(stu1);  
    stuSet.insert(stu2);  
   
    /*构造一个测试的Student,可以看到,即使stuTemp与stu1实际上并不是同一个对象, 
     *但当在set中查找时,仍会查找成功。这是因为已定义的studentSortCriterion的缘故。 
     */  
    Student stuTemp;  
    stuTemp.name = "张三";  
    stuTemp.age = 13;  
   
    set<Student, studentSortCriterion>::iterator iter;  
    iter = stuSet.find(stuTemp);  
    if(iter != stuSet.end()) {  
        cout << (*iter).name << endl;  
    } else {  
        cout << "Cannot fine the student!" << endl;  
    }  
   
    return 0;  
}

 

posted @ 2018-09-11 21:39  楼主好菜啊  阅读(195)  评论(0编辑  收藏  举报