首先按字符排序字符串

时间:2013-05-14 14:24:58

标签: c++ string sorting comparison stdstring

我在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
    };
};

1 个答案:

答案 0 :(得分:3)

如果我理解正确,你真正想要的只是数字 按字母顺序排列字符。任何时候你都可以 将排序标准恢复为字母的排序, 你可以使用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 ) ];
}

这将允许任何可以想象的排序,只要订购 可以逐字逐句地完成。