如果我理解正确,您真正想要的只是将数字排在字母字符之后。任何时候您可以将排序标准恢复到字母的顺序,您可以使用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 ) ];
}
这将允许任何可以想象的排序,只要排序可以逐个字符完成。