Как я могу сравнить, если символ в алфавитном порядке выше или ниже другого?

Почти как заголовок. Я пишу связанный список, и мне нужна функция для сортировки списка по алфавиту, и я довольно озадачен. Не знаю, как это никогда не возникало раньше, но я понятия не имею, как это сделать, кроме как создать собственную функцию, перечисляющую весь алфавит и сравнивающую позиции букв с нуля.

Есть ли простой способ сделать это?

Изменить для ясности:

У меня есть линейный связанный список объектов класса, у каждого объекта класса есть имя символа, и я пишу функцию для сравнения имени каждого объекта в списке, чтобы найти самый высокий объект в алфавитном порядке, а затем найти следующий возьмите объект в алфавитном порядке и т. д., связывая их вместе, пока я иду. У меня уже есть функция, которая делает это для целого поля, поэтому мне просто нужно переписать ее, чтобы сравнить неравенства между алфавитными символами, где а является наибольшим, а z — наименьшим.

Оглядываясь назад, это было, вероятно, намного более актуально, чем я думал.

Я думаю, что несколько ответов, которые я уже получил, должны сработать, поэтому я вернусь и выберу лучший ответ, как только получу его.

Я также работаю с G ++ и Unity.

0

Решение

Я думаю, что в общем случае лучшим подходом будет использование 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);

Но во многих типичных ситуациях вы можете просто сравнить символы с другими целочисленными типами.

5

Другие решения

Я думаю, что ваш список содержит 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 чтобы преобразовать символ в верхний регистр, затем всегда сравнивайте верхний регистр.

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

chars все еще числа, и их можно сравнивать как таковые. Прописные буквы и строчные буквы расположены по порядку, заглавные буквы перед нижними. (Такой, что ‘Z’ < «а».) ASCII таблица.

1

Как видно из этой таблицы ASCII, все буквенно-цифровые символы отображаются в правильном алфавитном порядке относительно их фактических значений:

введите описание изображения здесь

«Есть ли простой способ сделать это?»

Так что да, сравнение значений символов обеспечит их сортировку в алфавитном порядке.

0

будет ли что-то вроде ниже достаточно? преобразовать все в верхний сначала.

class compareLessThanChar{
public:
bool operator()(const char a, const char b)
{ return toupper(a) < toupper(b); }
}std::multiset<char, compareLessThanChar> sortedContainer;
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector