为啥列表容器的排序功能不起作用[关闭]

Posted

技术标签:

【中文标题】为啥列表容器的排序功能不起作用[关闭]【英文标题】: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? 谢谢大家,我犯了一个错误,再次感谢您对我的第一个 *** 问题的及时回复! 【参考方案1】:

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

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

【讨论】:

以上是关于为啥列表容器的排序功能不起作用[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

可排序列表在 ipad 上不起作用 [关闭]

为啥这个 if 语句在这种情况下不起作用? [关闭]

为啥我的函数在调用时不起作用? [关闭]

为啥我的 Pandas 引用多个列的“应用”函数不起作用? [关闭]

为啥这种 for 循环并行化在 Python 中不起作用?

为啥我的 ExtJS 4.2 网格面板排序不起作用?