我目前正在从输入文件中读取信息。在这些信息中,有一个名字。所有信息都被读入一个结构。这些结构有一个数组。
我需要使用二叉搜索树按姓氏按字母顺序排列结构。
我是否需要为 ==、< 和 > 编写运算符重载函数。如果是这样,有人可以帮我开始吗?
我目前正在从输入文件中读取信息。在这些信息中,有一个名字。所有信息都被读入一个结构。这些结构有一个数组。
我需要使用二叉搜索树按姓氏按字母顺序排列结构。
我是否需要为 ==、< 和 > 编写运算符重载函数。如果是这样,有人可以帮我开始吗?
是的,您需要为 == 和 < 编写运算符重载。(> 不需要;只需else
在检查后使用大小写,例如if (a < b)
; else if (a == b)
。)
在我们的例子中,由于我们按姓氏字母顺序排列,当且仅当它的姓氏按字母顺序排在另一个结构体的姓氏之前时,一个结构体“小于”另一个结构体。
那么究竟是什么问题呢?你知道如何编写运算符重载吗?您知道如何比较字符串并确定哪个字符串按字母顺序排在第一位吗?
您需要一种方法来比较结构的任何两个实例。写一个比较运算符,比如 ,operator<()
可能是一种方便的方法。
class Record {
friend bool operator<(const Record&, const Record&);
std::string name;
// ...
};
bool operator<(const Record& a, const Record& b)
{
// return true if the name of a is less than the name of b
}
因为一个节点要么插入左子树,要么插入右子树,你只需要知道一个节点是否“小于”另一个节点。如果不是,那么它是否大于或等于另一个节点都没有关系;无论哪种方式,它都在另一个子树上。
当然,您可能需要对其他一些任务进行相等比较。如果你这样做了,那么最好一路提供不等式运算符。
同样令人感兴趣的是rel_ops
命名空间。
您通常需要重载 <,但如果结构中还有其他元素您可能有时想要进行排序,那么这样做没有任何意义。您应该编写一个单独的函数来接受结构的两个参数,并按姓氏比较它们,如果第一个应该在第二个之前,则返回 true,否则返回 false。然后将该函数传递给 std::sort。像这样的东西:
bool compare_by_last_name(const MyStruct & lhs, const MyStruct & rhs)
{
return lhs.last_name < rhs.last_name;
}
// later
vector<MyStruct> v;
// put some elements in v
std::sort(v.begin(), v.end(), compare_by_last_name);
你会注意到我忽略了你的陈述“使用二叉搜索树”,因为我不太明白你的意思,但这可能是无关紧要的。您是否制作了自己的容器类或其他东西?
运算符重载就像函数或方法一样工作。它们以相同的方式获得返回类型和参数。例如,二元运算符(如<
)将是具有一个参数的成员函数或具有两个参数的自由函数,运算符的每一侧各一个。唯一不同的是它们没有标识符函数名称,而是使用特殊语法,关键字operator
后跟运算符被重载。所以如果我们想要一个可比较的类型,我们可以这样做:
class MyUserType
{
private:
std::string sort_significant;
std::string sort_insignificant;
public:
bool operator<(const MyUserType &) const;
};
bool MyUserType::operator<(const MyUserType & other) const
{
return sort_significant < other.sort_significant;
}