使用排序算法C

Using the sort algorithm C++

本文关键字:算法 排序      更新时间:2023-10-16

我正在阅读名称列表中,我想订购首先按字母顺序排列的姓氏。该文件将包含类似的内容

史密斯约翰467-604-4535

Kidd Jason 433-243-5252

etc

class record
{
        bool operator <(const record &rhs) const
        {
          return (lastname < rhs.lastname)
        }
    private:
        string fn, ln, pn;

};


int main(int argc, char *argv[])
{
    record data;
    ifstream fs;
    fs.open(arg2.c_str());
    vector<record> vec;
    while (fs >> data)
    {
        vec.push_back(data);

    }
    fs.close();
    sort (vec.begin(), vec.end(), data);
for (int i=0; i < vec.size(); i++)
        cout << vec[i];

}

给我带来错误的代码行是排序(vec.begin(),vec.end(),data),它给我带来了很多错误。不过,我所知的其他一切都在起作用。这只是等。有什么想法,这是什么问题?如何对矢量进行排序?

std::sort()在其第三个给定参数中调用 operator()。它需要一个可呼出的对象(函数)用作排序的谓词。您的谓词不提供一个,因此是汇编错误。

但是std::sort的详细信息指定如果您不提供自己的元素,则将在每个元素上使用operator<

std::sort(vec.begin(), vec.end());

要详细说明,有两个使用operator<std::sort的两个过载,另一个使用自定义排序函数。


在第二次查看您的代码中,看来您仅在std::string的右侧过载operator<。您必须一次为两个一次录制对象的operator<超载。

在课堂内您将其标记为friend

friend bool operator<(const record& lhs, const record& rhs)
{
    return lhs.lastname < rhs.lastname;
}

使用

使用
sort (vec.begin(), vec.end());

也不清楚该语句的含义

fs.open(arg2.c_str());

定义arg2在哪里?

您使用一对迭代器调用排序,((选项))可召唤对象,该对象知道如何比较您要排序的类型的两个项目。如果您不提供可选比较器,则排序将尝试在项目上使用operator<

请注意,比较器必须实施严格的弱排序。这意味着您的比较器必须完全一致。您的operator<示例并不完全一致。如果您有两个具有相同姓氏的员工(例如,"史密斯,简"answers"史密斯,约翰"),您将无法简单地比较姓氏,因为您不会获得一致的结果。如果姓氏不告诉您哪一个是第一个来的,则必须比较名字。等等。这是一个例子:

struct comparator {
  bool operator()(const record &lhs, const record &rhs) {
    if (lhs.lastname < rhs.lastname) return true;
    if (lhs.lastname == rhs.lastname) {
      if (lhs.firstname < rhs.firstname) return true;
      if (lhs.firthname == rhs.firstname) {
        // ... compare other fields ..
      }
    }
    return false;            
  }
};

没有严格的较弱的订购,您可能会很幸运(某些数据集可能会起作用),您可能会收到误差的数据,甚至可能崩溃。这取决于排序实现的详细信息以及您提供的特定数据集。

使用适当的函子进行比较,您可以称为Sorts:

sort(vec.begin(), vec.end(), comparator());