首先按字符对字符串进行排序
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进行排序