2

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

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

alphabetical("aardvark", "apple"); //true
alphabetical("balloon", "zebra"); //true
alphabetical("zebra", "apple"); //false

如果字符串相同,我也希望它返回 false。图书馆里有我可以使用的东西吗?或者,我将如何编写函数?我希望我能清楚地看到。

4

3 回答 3

4

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

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

return (score < rhs.score) || (score == rhs.score && team < rhs.team)

值得注意的是,字典排序并不总是人类所期望的。Jeff Atwood 在这篇文章中讨论了所谓的“自然排序顺序”与字典排序顺序。他的帖子还提供了资源,如果您需要这种排序,您可以从中找到算法。

于 2012-09-11T01:18:24.313 回答
1

如果您的字符串都是大写或小写,则标准字符串比较将起作用。我相信它甚至可以与不再使用的字符编码一起使用,例如 EBSIDIC 或其他。

如果你有混合大小写,那么这不起作用,因为'A'大于'z'。为此,您需要使用 stricmp 之类的东西。您还可以为您的 basic_string 覆盖 char_traits 以进行不敏感的比较。

如果您想编写这样的排序方式,将“A”放在“a”之前,反之亦然,但将“b”放在“a”之后……那么你需要自己写。使用当今大多数操作系统使用的 ASCII 表应该相当简单。

如果您必须支持英语以外的语言,那么问题实际上变得不简单。

于 2012-09-11T01:20:37.687 回答
-1

如果你使用std::strings 你可以只使用<. 但是,如果您已经拥有char*,并且不想(或不能)更改它,并且想要避免转换为 的开销std::string,那么您可以使用std::lexicographical_compare().

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

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);
    });
}
于 2012-09-11T01:19:10.213 回答