【发布时间】:2015-11-05 14:32:51
【问题描述】:
我有以下用户定义的类,
class simple
{
public:
simple(string str1, string str2)
: s1(str1)
, s2(str2)
{
}
const string& getS1() const {return s1;}
const string& getS2()const {return s2;}
bool operator<(const simple& s) {
return strcmp(this->getS1().c_str(), s.getS1().c_str()) < 0 && strcmp(this->getS2().c_str(), s.getS2().c_str()) < 0;
}
private:
const string s1;
const string s2;
}
我将这个类存储在 std::set 中,如下所示:
std::set<simple*> mySimplePtrSet;
simple* s1 = new simple("stack", "overflow");
simple* s2 = new simple("go", "ogle");
simple* s3 = new simple("stack", "overflow");
simple* s4 = new simple("go", "good");
simple* s5 = new simple("my", "overflow");
在上面的示例中,集合应该只包含 s1、s2、s4 和 s5。
考虑到类的数据成员(即s1和s2),如何在集合中存储唯一的类对象?
我尝试了以下比较器功能,但它不起作用。
struct myCom {
bool operator()(const simple* a,const simple* b){
return *a < *b;
}
};
注意:在我的情况下,排序并不重要,如果插入未排序的元素对我来说没问题。
【问题讨论】:
-
你为什么使用指针?
-
有趣的
operator<。它甚至没有使用提供的参数。 -
澄清上述评论:当明显的意图是将
this与s进行比较时,代码将this与this进行比较 -
一个更复杂的问题是“独特”是什么意思,以及比较的两个部分是如何相互作用的。通常的方法是让第二个充当第一个的决胜局。这在提供的规则中没有完成。混合这两种比较的其他方法可以创建有效的排序,但引用的一种(在修复上述错误之后)不会。
-
鉴于唯一性的定义,您需要以通常的方式重写比较,以便仅当第一部分相等时才涉及第二部分。 Brahim 引用了您的订购无效的确切规则。但即使它是有效的,它也不是你所需要的。您需要常见的决胜局模式。
标签: c++ stl set operator-overloading