我在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
};
};
答案 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 ) ];
}
这将允许任何可以想象的排序,只要订购 可以逐字逐句地完成。