-2

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

1 回答 1

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 ) ];
}

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

于 2013-05-14T14:38:15.343 回答