记录一下最近学习set时遇到的一些问题。

通常

1、set中的元素都是排好序的

2、set集合中没有重复的元素

当我们用set来保存自定义类对象的时候,我们需要规定比较规则,就是重载less<>(),因为set要排序,排序又要用到比较。

 

例子:

class Test2 {
public:
    Test2(int n):num(n) {};
    ~Test2() {};
public:
    int num;
    string name;

};
    template<>
    struct std::less<Test2>
    {
        bool operator()(const Test2 t1, const Test2 t2) const
        {
            return t1.num < t2.num;
        }
    };

int main(){
    set<Test2> test2_set2{ Test2(2), Test2(9), Test2(9), Test2(23), Test2(23), Test2(9), Test2(9), Test2(23), Test2(23) };
    for (auto iter : test2_set2) { cout << iter.num<<" "; }cout << endl;

    system("pause");
    return 0;
}

 

 输出:

这样和平时的set无异。

但是我往set里装对象指针的时候就不一样了:

int main(){

    set<Test2*> test2_set{ new Test2(2),new Test2(9),new Test2(9),new Test2(23),new Test2(23),new Test2(9),new Test2(9),new Test2(23),new Test2(23) };
    for (auto iter : test2_set) { cout << iter->num << " "; }cout << endl;

    system("pause");
    return 0;
}

输出:

对于这个set值重复的原因应该是set在排序时调用less<>()函数没有对应指针的参数,每个指针的位置都不一样,结果就全部都存进set了。

加上:

  

  template<>
    struct std::less<Test2*>
    {
        bool operator()(const Test2* t1, const Test2* t2) const
        {
            return t1->num < t2->num;
        }
    };


就可以了。

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐