c++ - 如何使用区分大小写的元素对 std::list 进行排序?

标签 c++ list sorting stl

这是我当前的代码:

#include <list>
#include <string>
using std::string;
using std::list;

int main()
{
    list <string> list_;
    list_.push_back("C");
    list_.push_back("a");
    list_.push_back("b");

    list_.sort();
}

sort() 函数是否根据字符代码对元素进行排序?我希望排序完成后这里的结果是 a b C

最佳答案

如果您想支持其他语言的字符,则不区分大小写的字符比较会很棘手。这就是为什么以对语言环境敏感的方式执行它们是个好主意:

struct char_iless 
: public std::binary_function<char, char, bool>
{
    std::locale loc;

    char_iless(std::locale const & loc=std::locale()) : loc(loc) 
    {
    }

    bool operator()(char a, char b) const
    {
        return std::tolower(a, loc) < std::tolower(b, loc);
    }
};

这就是你如何使用这个类来比较两个字符:

char_iless('a', 'b', my_locale);

如果您想使用设置为默认的区域,只需使用 std::locale() 作为 my_locale

如果您可以使用 Boost,那么字符串算法库中就有一个 is_iless 仿函数,它可以做同样的事情。

由于 std::lexicographical_compare,将此从比较字符扩展到字符串很容易:

struct str_iless 
: public std::binary_function<std::string, std::string, bool>
{
    std::locale loc;

    str_iless(std::locale const & loc=std::locale()) : loc(loc) 
    {
    }

    bool operator()(std::string const & a, std::string const & b) const
    {
        return std::lexicographical_compare(
            a.begin(), a.end(),
            b.begin(), b.end(),  
            char_iless(loc)
        );
    }
};

现在您已具备解决问题​​所需的一切:

int main()
{
    std::list<std::string> list;
    list.push_back("C");
    list.push_back("a");
    list.push_back("b");

    // Sort using default locale
    list.sort(str_iless());  

    // Sort using French locale 
    // (warning: this locale format string is MS specific)
    std::locale loc("French_France.1252");
    list.sort(str_iless(loc));
}

关于c++ - 如何使用区分大小写的元素对 std::list 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2346714/

相关文章:

c++ - 从 VBA 调用 xll UDF

c++ - "gpu/mxGPUArray.h"文件的路径在哪里?

python - 计算 Python 列表中某个模式出现的次数

java - 冒泡排序模块似乎不起作用;输出错误列表(java)

c++ - JPEG 哈夫曼表

c++ - std::chrono::duration::zero() 的目的是什么

performance - Prolog 性能和递归类型

java - 为什么我可以声明一个接口(interface)类型的对象,并将该对象实例化为另一种类型?

mysql - 从另一个表中按特定顺序排序的表中选择值

javascript - 根据嵌套值按字典顺​​序对对象数组进行排序