就像标题一样。我正在写一个链表,我需要一个按字母顺序对列表进行排序的功能,而且我很难过。不知道以前从未出现过这种情况,但除了创建我自己的函数列表整个字母表并从头开始比较字母的位置之外,我不知道如何做到这一点。
有没有简单的方法可以做到这一点?
为清晰起见编辑:
我有一个类对象的线性链表,每个类对象都有一个char名,我正在编写一个函数来比较列表中每个对象的名称,按字母顺序找到最高的对象,然后按字母顺序排列下一个对象,等等,将它们连接起来。我已经有一个为int字段执行此操作的函数,所以我只需要重写它来比较字母字符之间的不等式,其中a是最大的,z是最小的。
事后看来,这可能比我想象的更有意义。
我认为我已经得到的一些答案应该有效,所以一旦我开始工作,我就会弹出并选择最佳答案。
我也在使用g ++和unity。
答案 0 :(得分:5)
我认为一般情况下最好的方法是使用std :: char_traits:
char a, b;
std::cin >> a >> b;
std::locale loc;
a = std::tolower(a, loc);
b = std::tolower(b, loc);
std::cout << std::char_traits::compare(&a, &b, 1u);
但是在许多常见情况下,您可以简单地将字符与其他整数类型进行比较。
答案 1 :(得分:1)
#include <stdio.h>
#include <ctype.h>
void main(void) {
char a = 'X', b = 'M';
printf("%i\n", a < b);
printf("%i\n", b < a);
printf("%i\n", 'a' < 'B');
printf("%i\n", tolower('a') < tolower('B'));
}
打印出来:
0
1
0
1
char
仍是数字,可以这样比较。大写字母和小写字母都是有序的,大写字母在下面。 (这样'Z'&lt;'a'。)见ASCII table。
答案 2 :(得分:1)
我的猜测是,您的列表包含char*
作为数据(最好包含std::string
作为数据)。如果列表由后者组成,您只需使用重载的std::string
&#39; operator<
进行排序,例如
return str1 < str2; // true if `str1` is lexicographically before `str2`
如果您的列表由类似C的空终止字符串组成,那么您可以使用std::strcmp
对其进行排序,例如
return std::strcmp(s1, s2);
或使用std::char_traits::compare
(如@Anton所述)
return std::char_traits<char>::compare(s1, s2, std::min(std::strlen(s1), std::strlen(s2)));
或通过临时std::string
(最昂贵)进行排序,例如
return std::string(s1) < std::string(s2); // here s1 and s2 are C-strings
如果您的列表只包含字符,那么,如评论中所述,
return c1 < c2; // returns true whenever c1 is before c2 in the alphabet
如果您不关心大写/小写,那么您可以使用std::toupper
将字符转换为大写,然后始终比较大写。
答案 3 :(得分:0)
从这个ASCII表中可以看出,所有字母数字字符都按正确的字母顺序显示,与实际值有关:
&#34;有没有简单的方法呢?&#34;
所以是的,比较字符值将使它们按字母顺序排序。
答案 4 :(得分:0)
下面的东西就够了吗?首先将所有内容转换为高位。
class compareLessThanChar{
public:
bool operator()(const char a, const char b)
{ return toupper(a) < toupper(b); }
}
std::multiset<char, compareLessThanChar> sortedContainer;