我有一些课程,例如:
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;对象。
什么是最好的选择?
答案 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));
中移除新内容。