看流星社区

 找回密码
 注册账号
查看: 1939|回复: 0

C++标准库排序方法大全

[复制链接]

该用户从未签到

发表于 2013-2-11 19:23:47 | 显示全部楼层 |阅读模式
这个题目有点儿无聊,跟茴香豆的“茴”字有几种写法一样无聊,又是一个无聊的老掉牙的话题——排序,问题依然是无聊至极——把输入的单词按顺序(我可没说是什么顺序)排列。当作是一个总结吧。

    按词典排好说,如果你用vector<string> words存储单词,只需用algorithm里的sort即可:sort(words.begin(),words.end())。这玩意儿我闭着眼也能敲出来。但假如你用list的话……编译器发脾气了吧?(发脾气是好的,要是没有任何抱怨,趁早儿扔了吧)。list容器不支持随机访问,标准库的sort没法用到它上面。幸好list自己带了一个sort,所以要用words.list()。

    如果要按和词典相反的顺序排呢?对sort而言,默认是采用“<”来比较的,如果让它采用“大于”不就行了吗?标准库当然为此“预留了接口”。你可以先写一个比较函数,如compare,记着用大于号“>”比较:

bool compare(string s1, string s2)...{
    return s1>s2;
}

接着调用三个参数的sort版本:sort(words.begin(),words.end(),compare)就成了。对于list容器,这个方法也适用,把compare作为sort的参数就可以了,即:words.sort(compare)。

    更进一步,我现在要让这种操作更加能适应变化。也就是说,我希望能给比较函数一个参数,用来指示是按升序还是按降序排。这回给轮到函数对象出场了。

    为了描述方便,我先定义一个枚举类型EnumComp用来表示升序和降序。很简单:

enum EnumComp...{ASC, DESC};

然后开始用一个类来描述这个函数对象。它会根据它的参数来决定是采用“<”还是“>”。嗯……我想应该是这个样子的:

class Compare
...{
    private:
        EnumComp comp;
    public:
        Compare(EnumComp c):comp(c)...{};
        bool operator()(string s1, string s2)...{
            switch(comp)...{
                case DESC:
                    return s1>s2;
                case ASC:
                    return s1<s2;
            }
        }
};
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-2 22:31

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表