【问题标题】:Using the sort algorithm C++使用排序算法 C++
【发布时间】:2014-02-03 06:29:59
【问题描述】:

我正在阅读姓名列表,我想按字母顺序排列姓氏。该文件将包含这样的内容

史密斯约翰 467-604-4535

基德杰森 433-243-5252

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];



}

给我错误的代码行是 sort (vec.begin(), vec.end(), data) 它给了我很多错误。据我所知,其他一切都在工作。这只是排序。有什么想法有什么问题吗?如何对向量进行排序?

【问题讨论】:

  • std::sort 有两个重载,它们都没有将 T 类型的对象作为第三个参数。只需使用sort(vec.begin(), vec.end());
  • 所以我们应该以某种方式猜测错误是什么?

标签: c++ sorting


【解决方案1】:

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

std::sort 的详细信息指定如果您不提供自己的元素,它将在每个元素上使用operator&lt;

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

详细地说,std::sort两个 重载,一个使用 operator&lt;,另一个使用自定义排序函子。


再次查看您的代码,您似乎只重载了operator&lt; 的右侧std::string。您必须一次为 两个 记录对象重载 operator&lt;

在类中,您可以将其标记为friend

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

【讨论】:

  • @JakeSmith 没问题。 :)
  • @JakeSmith 另外,请不要忘记接受我的回答。 :)
【解决方案2】:

改为使用

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

也不清楚这句话是什么意思

fs.open(arg2.c_str());

arg2 是在哪里定义的?

【讨论】:

  • 当我这样做时,它仍然给我一个错误提示。它很长,它不允许我复制粘贴它......任何想法为什么这不起作用?
  • 从您提供的代码中,我无法断定您的第二个错误的原因是什么。我希望运营商
【解决方案3】:

您使用一对迭代器和(可选)一个知道如何比较您正在排序的类型的两个项目的可调用对象来调用 sort。如果您不提供可选的比较器,sort 将尝试在项目上使用 operator&lt;

请注意,比较器必须实现strict weak ordering。这意味着您的比较器必须完全一致。您的 operator&lt; 示例并不完全一致。如果您有两个姓氏相同的员工(例如,“Smith, Jane”和“Smith, John”),您不能简单地比较姓氏,因为您不会得到一致的结果。如果姓氏不能告诉您哪个先出现,那么您必须比较名字。等等。这是一个例子:

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;            
  }
};

如果没有严格的弱排序,您可能会很幸运(某些数据集可能看起来有效),您可能会得到错误排序的数据,甚至可能崩溃。这取决于排序实现的细节和你给它的特定数据集。

使用适当的函子进行比较,您可以像这样调用 sort:

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

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2019-04-03
    相关资源
    最近更新 更多