Функция — C ++, как определить, стоит ли одно слово перед другим в алфавите

Я использую sort() функция в C ++ для сортировки вектора объектов типа «Game», который я определил сам. Для этого я вручную пишу функцию, которая будет действовать вместо operator<и который будет передан в качестве третьего параметра sort() функция. Сначала я сравниваю на основе оценок. Затем, если результаты связаны, я сравниваю по названию команды.

Что мне нужно это функция alphabetical(string s1, string s2), который вернет истину, если s1 придет раньше s2 в словаре. Например:

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

Я также хочу, чтобы он возвращал false, если строки идентичны. Есть ли что-то в библиотеке, что я мог бы использовать? Или как бы написать функцию? Я надеюсь, что я сталкиваюсь ясно.

2

Решение

std::string реализует лексикографический оператор сравнения меньше, что означает, что stringA < stringB обычно надо делать что хочешь. Если вы создаете std::list<std::string> wordsсортировка по алфавиту будет так же проста, как words.sort();

Ваш обычай Game класс может иметь свой оператор сравнения меньше, чем просто:

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

Стоит отметить, что лексикографическая сортировка не всегда будет соответствовать ожиданиям человека. Джефф Этвуд обсуждает так называемый «естественный порядок сортировки» и лексикографический порядок сортировки в эта почта. Его пост также содержит ресурсы, из которых вы сможете найти алгоритмы, если вам нужна такая сортировка.

4

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

Стандартное сравнение строк будет работать, если ваши строки все верхние или нижние. Я считаю, что это работает даже с кодировками символов, которые больше не используются, такими как EBSIDIC или что-то еще.

Если у вас смешанный регистр, то это не работает, потому что «A» больше, чем «z». Чтобы это работало, вы захотите использовать такие вещи, как Stricmp или что-то еще. Вы также можете переопределить char_traits для своей basic_string, чтобы сделать нечувствительное сравнение.

Если вы хотите написать такой вид, что он ставит «A» перед «a» или наоборот, а «b» после «a» … тогда вам нужно написать свой собственный. Это должно быть довольно просто, используя таблицу ASCII, которую сегодня использует большинство операционных систем.

Если вам приходится поддерживать языки, отличные от английского, проблема на самом деле становится нетривиальной.

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);
});
}
-1
По вопросам рекламы [email protected]