首先按字符对字符串进行排序

Posted

技术标签:

【中文标题】首先按字符对字符串进行排序【英文标题】:Sorting strings by characters first 【发布时间】:2013-05-14 14:24:57 【问题描述】:

我在 C++ 中使用 std::map,它按字母顺序对键进行排序,如下所示:

AAA, AA0, AA1, AAB, AC1 = AA0->AA1->AAA->AAB->AC1

但我想以不同的方式对其进行排序:

AAA, AA0, AA1, AAB, AC1 = AAA->AAB->AA0->AA1->AC1

如何为 std::map 编写一个比较类,这将解决我的问题? 我完全不知道该怎么做。 这是我的比较类的定义:

struct Comp

    bool operator()(const std::string& lhs, const std::string& rhs) const
    
       //dont know what should I write here
    ;
;

【问题讨论】:

我认为@juanchopanza 故意把它留给你作为练习。 :P 还值得指出的是,如果你想定期处理这样的字符串,最好提供一个用户定义的char_traits 二阶是什么意思?你能用一个格式良好的算法来描述它吗? 首先用简单的文字制定您的算法,然后将这些文字翻译成代码。 IOW,如果没有明确定义(不仅仅是示例)您想要实现的目标,您就无法编写任何代码。有了它,它通常非常简单。 @M.M. :他希望数字字符在比较时出现在字母之后...... @user2342783 如果你知道两个字符串都是单个字符,你能写出那个函数吗?如果你能写出来,你就大功告成了。 【参考方案1】:

如果我理解正确,您真正想要的只是数字 按字母字符排序。任何时候都可以 将排序标准恢复到字母的顺序, 你可以使用std::lexicographical_compare,通过它 一个比较运算符,它可以满足您的需要 人物。

我通常将它组合在一个比较运算符中:

struct Comp

    bool isDigit( char lhs ) const
    
        return ::isdigit( static_cast<unsigned char>( lhs ) );
    

    bool operator()( char lhs, char rhs ) const
    
        return isDigit( lhs ) == isDigit( rhs )
            ? lhs < rhs
            : isDigit( rhs );
    

    bool operator()( std::string const& lhs, std::string const& rhs ) const
    
        return std::lexicographical_compare(
            lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), *this);
    
;

如需更一般化的比较,您可以提供一张地图 要比较的值并使用它:

bool Comp::operator()( char lhs, char rhs ) const

    return myMap[ static_cast<unsigned char>( lhs ) ]
        <  myMap[ static_cast<unsigned char>( rhs ) ];

这将允许任何可以想象的排序,只要排序 可以逐个字符完成。

【讨论】:

感谢您的帮助。 Visual Studio 说,std::lexicographical_compare( lhs, rhs, *this); 的参数太少(预计 4 或 5 个参数)。 @user2342783 抱歉。当然,它需要迭代器,而不是字符串。我会解决的。 非常感谢!我保证,我会在没有其他人帮助的情况下学习如何使用它:)!

以上是关于首先按字符对字符串进行排序的主要内容,如果未能解决你的问题,请参考以下文章

首先按布尔列对数组进行排序,然后按字符串列排序

在 JavaScript 中按属性对 JSON 字符串进行排序

如何按最低数字/字符串Android Studio对recyclerview进行排序

当属性是字符串时,如何按属性从左到右排序对象数组,首先具有数字?

Pandas 按逻辑天对数据帧进行排序

按字母顺序对 c 字符串数组进行排序