【问题标题】:Why does the sort function of list container not working [closed]为什么列表容器的排序功能不起作用[关闭]
【发布时间】:2016-11-13 18:21:08
【问题描述】:

我正在尝试列表容器的排序功能,传递一个函数对象和函数指针作为比较函数。 但不知何故,函数对象版本没有成功。 l.sort(MylessFuncObj()) 的输出是:

1
2
3
5
45

虽然我预计输出是 1 2 3 45 5。但我不太明白的另一件事是,如果在 l.sort() 之前使用它,l.sort(MylessFuncObj()) 确实工作得很好。

刚开始学cpp,真的卡住了..

    #include <list>
    #include <iostream>
    using namespace std;
    class MylessFuncObj
    {
    public:
        bool operator()(const int &a, const int &b){
            return (a%10)<(b%10);
        }

    };
    bool Mylessfunc(const int &a, const int &b){
        return (a%10)<(b%10);
    }

int main()
{
    list<int> l={1, 2, 3, 45,5};
    l.sort(Mylessfunc);
    for(int j:l) cout<<j<<endl;
    l.sort();
    cout<<endl;
    for(int j:l) cout<<j<<endl;
    cout<<endl;
    l.sort(MylessFuncObj());
    for(int j:l)
    cout<<j<<endl;
    return 0;
}

【问题讨论】:

  • 整数不是按字典顺序排序的……它们是按值排序的……在现实生活中你真的会这样排序吗?
  • 您是否尝试过使用相同的一组值初始化列表的不同实例,而不是多次对同一个列表进行排序?
  • 它已根据您的排序功能正确排序。为什么你认为 45 必须在 5 之前?
  • 嗯,45 mod 10 是 5 而 5 mod 10 是 5。那么根据您的比较函子,为什么您认为 45 小于 5?
  • 谢谢大家,我犯了一个错误,再次感谢您对我的第一个 stackoverflow 问题的及时回复!

标签: c++ sorting stl


【解决方案1】:

45 和 5 根据您的比较函数比较相等,因此它们可以以任何顺序出现。列表排序是稳定的,因此它们将保持原来的顺序。

最初,这个订单是45 5,这就是你的第一个打印应该显示的内容。在l.sort()(使用默认比较功能)之后,顺序变为5 45,并且使用您的自定义比较功能进行的任何进一步排序都将保留此顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多