首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++如何确定一个单词在字母表中是否在另一个单词之前

c++如何确定一个单词在字母表中是否在另一个单词之前
EN

Stack Overflow用户
提问于 2012-09-11 09:11:53
回答 3查看 4.9K关注 0票数 2

我使用C++中的sort()函数对“游戏”类型的对象向量进行排序,这是我自己定义的。为此,我手动编写了一个替代operator<的函数,该函数将作为第三个参数传递给sort()函数。首先,我根据分数进行比较。然后,如果得分相等,我会根据团队名称进行比较。

我需要的是一个函数alphabetical(string s1, string s2),如果s1在字典中出现在s2之前,它将返回true。例如:

代码语言:javascript
复制
alphabetical("aardvark", "apple"); //true
alphabetical("balloon", "zebra"); //true
alphabetical("zebra", "apple"); //false

如果字符串相同,我还希望返回false。图书馆里有没有我可以用的东西?或者,我该如何编写函数呢?我希望我说得很清楚。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-11 09:18:24

std::string本身实现了一个字典序小于比较运算符,这意味着stringA < stringB通常应该做您想做的事情。如果创建std::list<std::string> words,按字母顺序排序将与words.sort();一样简单

您的自定义Game类可以简单地将其小于比较运算符实现为:

代码语言:javascript
复制
return (score < rhs.score) || (score == rhs.score && team < rhs.team)

值得注意的是,字典排序并不总是人类所期望的。Jeff Atwood开始讨论所谓的“自然排序顺序”与this post中的词典排序顺序。他的帖子还提供了一些资源,如果你需要这样的排序,你可以从这些资源中找到算法。

票数 4
EN

Stack Overflow用户

发布于 2012-09-11 09:20:38

如果字符串全部为大写或小写,则标准字符串比较将起作用。我相信它甚至适用于不再使用的字符编码,如EBSIDIC或其他。

如果你有大小写混合的情况,那么这是不起作用的,因为'A‘大于'z’。为了让它起作用,你需要使用诸如stricmp之类的东西。您还可以覆盖basic_string的char_traits以执行不敏感的比较。

如果你想把'A‘放在'a’之前,或者相反,把'b‘放在’a‘后面……那么你需要自己写。使用当今大多数操作系统使用的ASCII表应该是相当简单的。

如果你必须支持英语以外的语言,那么这个问题实际上就不是那么简单了。

票数 1
EN

Stack Overflow用户

发布于 2012-09-11 09:19:10

如果你使用的是std::strings,你可以直接使用<。但是如果你已经有了char*,你不想(或者不能)改变这一点,并且你想避免转换成std::string的开销,那么你可以使用std::lexicographical_compare()

当然,在这两种情况下,您可能需要不区分大小写的比较。现在,我不确定std::string的正确解决方案是什么,可能与char_traits有关,但对于lexicographical_compare(),您可以提供一个比较器:

代码语言:javascript
复制
bool alphabetical(const char *str1, const char *str2) {
    return std::lexicographical_compare(str1, &str1[strlen(str1)], str2, &str2[strlen(str2)], [](char a, char b){
        return tolower(a) < tolower(b);
    });
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12361447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档