C ++ - Alphabetizing Strings

时间:2010-12-02 02:21:17

标签: c++ string operator-overloading alphabet

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

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

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

4 个答案:

答案 0 :(得分:1)

是的,您需要为==和&lt;编写运算符重载。 (&gt;不需要;只需在检查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;
}