0

我目前正在从输入文件中读取信息。在这些信息中,有一个名字。所有信息都被读入一个结构。这些结构有一个数组。

我需要使用二叉搜索树按姓氏按字母顺序排列结构。

我是否需要为 ==、< 和 > 编写运算符重载函数。如果是这样,有人可以帮我开始吗?

4

4 回答 4

1

是的,您需要为 == 和 < 编写运算符重载。(> 不需要;只需else在检查后使用大小写,例如if (a < b); else if (a == b)。)

在我们的例子中,由于我们按姓氏字母顺序排列,当且仅当它的姓氏按字母顺序排在另一个结构体的姓氏之前时,一个结构体“小于”另一个结构体。

那么究竟是什么问题呢?你知道如何编写运算符重载吗?您知道如何比较字符串并确定哪个字符串按字母顺序排在第一位吗?

于 2010-12-02T02:29:22.550 回答
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命名空间。

于 2010-12-02T02:29:45.537 回答
0

您通常需要重载 <,但如果结构中还有其他元素您可能有时想要进行排序,那么这样做没有任何意义。您应该编写一个单独的函数来接受结构的两个参数,并按姓氏比较它们,如果第一个应该在第二个之前,则返回 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);

你会注意到我忽略了你的陈述“使用二叉搜索树”,因为我不太明白你的意思,但这可能是无关紧要的。您是否制作了自己的容器类或其他东西?

于 2010-12-02T02:36:08.417 回答
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;
}
于 2010-12-02T02:40:57.043 回答