如何解决c++ - 如何比较c ++中的字符串以便按字典顺序对它们进行排序?
我想创建一个函数来按字典顺序比较两个字符串,以便我可以按照“aa”
解决方法
你可能会
auto compare_string = [](const auto& lhss,const auto& rhss){
return std::lexicographical_compare(
lhss.begin(),lhss.end(),rhss.begin(),rhss.end(),[](const auto& lhsc,const auto& rhsc){
auto proj = [](char c){ return std::tuple(std::tolower(c),std::isupper(c)); };
return proj(lhsc) < proj(rhsc);
}
);
});
,
您想要的字符串排序方式不是 std::string 默认实现的方式。但是,您可以传入 std::char_traits 模板参数并自定义排序。
https://en.cppreference.com/w/cpp/string/char_traits
这里有一个关于不区分大小写字符串的实现的相当古老但仍然有趣的讨论:http://www.gotw.ca/gotw/029.htm
#include <string>
#include <string_view>
#include <iostream>
#include <cctype>
#include <cassert>
struct special_char_traits : public std::char_traits<char> {
static char to_upper(char ch) {
return std::toupper((unsigned char) ch);
}
static bool eq(char c1,char c2) {
return c1 == c2;
}
static bool lt(char c1,char c2) {
if (c1 == c2)
return false;
if (to_upper(c1) == to_upper(c2))
return !(c1 < c2);
return c1 < c2;
}
static int compare(const char* s1,const char* s2,std::size_t n) {
while ( n-- != 0 ) {
if ( lt(*s1,*s2)) return -1;
if ( !lt(*s1,*s2)) return 1;
++s1; ++s2;
}
return 0;
}
static const char* find(const char* s,std::size_t n,char a) {
while ( n-- != 0 )
{
if (*s == a)
return s;
s++;
}
return nullptr;
}
};
int main()
{
typedef std::basic_string<char,special_char_traits> ss;
//handle the case highligheted by Jarod42
assert(!special_char_traits::lt('a','a'));
assert(!special_char_traits::lt('A','A'));
assert(special_char_traits::lt('a','A'));
assert(!special_char_traits::lt('A','a'));
assert(!special_char_traits::lt('b','A'));
assert(special_char_traits::lt('A','b'));
std::cout << (std::string("AA") < std::string("aa")) << " " << (ss("AA") < ss("aa")) << std::endl;
}
仍有几种情况未经测试
比较函数将单个字符的比较委托给上面提供的 lt 函数。
,std::string a = "A";
std::string b = "B";
if(a < b)
// Do what you want.
std::string
重载了 <
运算符,这就是您对它们进行排序所需的一切。
另见:Using the less than comparison operator for strings
,只需创建一个接受两个字符串作为输入的函数。在函数上创建 STL 集。插入两个字符串。它们现在在集合内按字典顺序排序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。