Почти как заголовок. Я пишу связанный список, и мне нужна функция для сортировки списка по алфавиту, и я довольно озадачен. Не знаю, как это никогда не возникало раньше, но я понятия не имею, как это сделать, кроме как создать собственную функцию, перечисляющую весь алфавит и сравнивающую позиции букв с нуля.
Есть ли простой способ сделать это?
Изменить для ясности:
У меня есть линейный связанный список объектов класса, у каждого объекта класса есть имя символа, и я пишу функцию для сравнения имени каждого объекта в списке, чтобы найти самый высокий объект в алфавитном порядке, а затем найти следующий возьмите объект в алфавитном порядке и т. д., связывая их вместе, пока я иду. У меня уже есть функция, которая делает это для целого поля, поэтому мне просто нужно переписать ее, чтобы сравнить неравенства между алфавитными символами, где а является наибольшим, а z — наименьшим.
Оглядываясь назад, это было, вероятно, намного более актуально, чем я думал.
Я думаю, что несколько ответов, которые я уже получил, должны сработать, поэтому я вернусь и выберу лучший ответ, как только получу его.
Я также работаю с G ++ и Unity.
Я думаю, что в общем случае лучшим подходом будет использование 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);
Но во многих типичных ситуациях вы можете просто сравнить символы с другими целочисленными типами.
Я думаю, что ваш список содержит char*
как данные (это лучше содержать std::string
как данные). Если список состоит из последнего, вы можете просто отсортировать, используя перегруженный std::string
«s 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
чтобы преобразовать символ в верхний регистр, затем всегда сравнивайте верхний регистр.
#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
s все еще числа, и их можно сравнивать как таковые. Прописные буквы и строчные буквы расположены по порядку, заглавные буквы перед нижними. (Такой, что ‘Z’ < «а».) ASCII таблица.
Как видно из этой таблицы ASCII, все буквенно-цифровые символы отображаются в правильном алфавитном порядке относительно их фактических значений:
«Есть ли простой способ сделать это?»
Так что да, сравнение значений символов обеспечит их сортировку в алфавитном порядке.
будет ли что-то вроде ниже достаточно? преобразовать все в верхний сначала.
class compareLessThanChar{
public:
bool operator()(const char a, const char b)
{ return toupper(a) < toupper(b); }
}std::multiset<char, compareLessThanChar> sortedContainer;