set(c ++)and operator<超载

时间:2015-10-17 20:09:54

标签: c++ list set overloading

我有一些课程,例如:

vector[0]

我正在使用类似于这个类的东西:

class foo {

    private:
        int number;
        ...

    public:

        foo(int set_number):number(set_number) {}
        ...

        bool operator<(const foo &myfoo) const
        { 
            return (number < myfoo.number ? 1 : 0); 
        }
        /* operator < */

        bool operator==(const foo &myfoo) const
        { 
             return (number == myfoo.number ? 1 : 0); 
        }
        /* operator == */

        ...
};

好的,所以当我打印结果时,我得到了:

class hello {
    private:
        set<foo*> list;
        set<int>  int_list;
        ...
    public:
        ...
        fillList(void)
        {
           for(int i=0; i<10; i++)
           {
              list.insert(new foo(i));
              int_list.insert(i);
           }
        }
        ...
};

显然第二个不好。我想这与set是由指针而不是对象构成的事实有关。

现在,我应该像set set一样使用我的设置吗? foo&gt; ?或者是否有使用指针的解决方案?也许我可以使用类似的东西来重载运算符:

int_list: 0, 1, 2, 3, 4, ... 
list: 0, 6, 4, 5, ... (Using a method to print the attribute "number" from the object foo).

我正在使用这个“set&lt; foo *&gt;”。因为我被教导在矢量中使用这种方式&lt;类型&gt;对象。

什么是最好的选择?

1 个答案:

答案 0 :(得分:1)

如果您想在集中进行自定义排序,则无法覆盖&lt;运营商因为:

set<foo*>

它是一组指针。改为使用:

set<foo*, compare>

struct compare {
    bool operator() (const foo * lhs, const foo * rhs) const{
        return lhs->operator<(*rhs);
    }
};

的原因

你的集合正在排序指针。如果您将compare添加到set<foo*, compare>,则强制使用指向类的< operator

替代不使用指针

只需使用set<foo>并从list.insert(new foo(i));中移除新内容。