我目前正在从输入文件中读取信息。在那些信息中,有一个名字。所有信息都被读入结构中。这些结构有一系列结构。
我需要使用二进制搜索树按姓氏按字母顺序排列结构。
我是否需要为==,<和>编写运算符重载函数。如果是这样,有人可以帮我开始吗?
答案 0 :(得分:1)
是的,您需要为==和<编写运算符重载。 (>不需要;只需在检查else
; if (a < b)
之后使用else if (a == b)
案例。)
在我们的例子中,由于我们按姓氏按字母顺序排列,因此当且仅当其姓氏按字母顺序排在另一个姓氏之前时,一个结构“小于”另一个结构。
究竟是什么问题?你知道如何编写运算符重载吗?你知道如何比较字符串并确定哪个字母按字母顺序排列吗?
答案 1 :(得分:1)
您需要一种方法来比较结构的任何两个实例。编写比较运算符,比如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
命名空间。
答案 2 :(得分:0)
你通常需要重载&lt;,但是如果结构中有其他元素你可能有时想要排序,那么这样做是没有意义的。您应该编写一个单独的函数来接受结构的两个参数,并按姓氏进行比较,如果第一个应该在第二个之前,则返回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);
您会注意到我忽略了您的声明“使用二进制搜索树”,因为我不太清楚您的意思,但它可能无关紧要。你有自己的容器类吗?
答案 3 :(得分:0)
运算符重载就像函数或方法一样工作。它们以相同的方式获得返回类型和参数。例如,二元运算符(如<
)将是具有一个参数的成员函数或具有两个的自由函数,每个运算符用于运算符的每一侧。唯一不同的是,它们不是使用标识符函数名称,而是使用特殊语法,关键字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;
}