Как проверить, отсортирован ли массив строк - PullRequest
0 голосов
/ 16 декабря 2018

Как проверить, отсортированы ли заданные элементы в моем массиве строкового типа или нет.Если бы это был целочисленный тип, сравнение было бы легко.Я не вижу, как мы можем сравнить слова.

Ответы [ 4 ]

0 голосов
/ 16 декабря 2018

Просто используйте соответствующий алгоритм.

Если ваш тип "string" равен std::string, используйте оператор сравнения по умолчанию:

std::is_sorted(std::begin(my_string_array), std::end(my_string_array);

Если типом "string" является Cв стиле строки вы должны предоставить функцию сравнения:

std::is_sorted(std::begin(my_string_array), std::end(my_string_array,
    [](const char* lhs, const char* rhs) {
        return std::strcmp(lhs, rhs) < 0;
    }
);
0 голосов
/ 16 декабря 2018

std::string объекты можно сравнивать с обычными операторами , как с основными типами.

Вы можете написать цикл вручную или просто использовать стандартный алгоритм библиотеки std::is_sorted.

std::string Str[3] = { "ali", "zedan", "kali" };

bool result = std::is_sorted(Str, Str + 3);

// or using iterators

bool result = std::is_sorted(std::begin(Str), std::end(Str));
0 голосов
/ 16 декабря 2018

Помимо функций std::string, вы можете сравнить символов точно так же, как вы сравниваете целых чисел .Во-первых, проверьте таблицу ASCII ниже:

ASCII TABLE

Как видите, каждому символу соответствует некоторое десятичное число, и они пронумерованы в алфавитном порядке (a = 97, b = 98, c = 99 ...) , чтобы вы могли сравнивать их так же, как целые числа. Но обратите внимание, что , прописные и строчные буквы имеют разные соответствующие десятичные дроби.Таким образом, когда вы сделаете сравнение в вашей строке, чтобы проверить, отсортирована она или нет, сначала округлите все символы в строке, чтобы уменьшить их, так как заглавные буквы имеют больше маленьких соответствующих десятичных чисел, чем строчные буквы вТаблица ASCII.Итак, ваша функция должна быть такой:

bool is_string_sorted(std::string str){

    for(int i = 0; i < str.size() - 1; i++){

        str[i] = tolower(str[i]);
        str[i+1] = tolower(str[i+1]);

        if(str[i] > str[i+1]){

            return false;

        }


    }

    return true;
}
0 голосов
/ 16 декабря 2018

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

строка s1 меньше строки s2 s1 < s2, если s1 появится перед s2 в лексикографическом порядке.

Обычные операторы сравнения применяются к строкам так же, как к целым числам

...