Как сравнить с помощью std::lexicographical_compare две строки внутри std::vector без учета регистра в C++?

Пользователь

от marshall.cummings , в категории: Другие , год назад

Как сравнить с помощью std::lexicographical_compare две строки внутри std::vector без учета регистра в C++?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от cayla , год назад

@marshall.***mings 

Для сравнения двух строк без учета регистра с помощью std::lexicographical_compare внутри std::vector необходимо определить функцию сравнения, которая будет принимать две строки и сравнивать их без учета регистра. Затем можно передать эту функцию третьим аргументом в std::lexicographical_compare.


Вот пример кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cctype>

bool caseInsensitiveStringCompare(const std::string& str1, const std::string& str2) {
    // Преобразуем обе строки в нижний регистр
    std::string lowerStr1, lowerStr2;
    lowerStr1.reserve(str1.length());
    lowerStr2.reserve(str2.length());

    // Копируем символы строк в новые строки, приводя к нижнему регистру
    for (char ch : str1) {
        lowerStr1.push_back(std::tolower(ch));
    }
    for (char ch : str2) {
        lowerStr2.push_back(std::tolower(ch));
    }

    // Выполняем сравнение строк без учета регистра
    return lowerStr1 < lowerStr2;
}


int main() {
    std::vector<std::string> strings = { "Apple", "banana", "cherry", "Donut" };

    // Сортируем вектор без учета регистра
    std::sort(strings.begin(), strings.end(), caseInsensitiveStringCompare);

    // Выводим отсортированный вектор
    for (const std::string& str : strings) {
        std::cout << str << " ";
    }
    std::cout << std::endl;

    return 0;
}


В данном примере определена функция caseInsensitiveStringCompare, которая принимает две строки и сравнивает их без учета регистра, преобразуя символы в нижний регистр с помощью функции std::tolower. После этого она передается в качестве третьего аргумента в std::sort. В результате строки в std::vector будут отсортированы без учета регистра и выводятся на экран.

Пользователь

от hobart.rath , 7 месяцев назад

@marshall.***mings 

Просто для небольшой корректировки, вам нужно использовать std::lexicographical_compare для сравнения двух строк, а не std::sort для сортировки вектора, потому что вам просто нужно сравнить строки без учета регистра, а не отсортировать их. Вот обновленный пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cctype>

bool caseInsensitiveStringCompare(const std::string& str1, const std::string& str2) {
    // Преобразуем обе строки в нижний регистр
    std::string lowerStr1, lowerStr2;
    lowerStr1.reserve(str1.length());
    lowerStr2.reserve(str2.length());

    // Копируем символы строк в новые строки, приводя к нижнему регистру
    for (char ch : str1) {
        lowerStr1.push_back(std::tolower(ch));
    }
    for (char ch : str2) {
        lowerStr2.push_back(std::tolower(ch));
    }

    // Выполняем сравнение строк без учета регистра
    return lowerStr1 < lowerStr2;
}

int main() {
    std::vector<std::string> strings = { "Apple", "banana", "cherry", "Donut" };

    // Сравниваем строки в векторе без учета регистра
    bool result = std::lexicographical_compare(strings[0].begin(), strings[0].end(),
                                               strings[1].begin(), strings[1].end(),
                                               caseInsensitiveStringCompare);

    if (result) {
        std::cout << strings[0] << " is less than " << strings[1] << std::endl;
    } else {
        std::cout << strings[1] << " is less than " << strings[0] << std::endl;
    }

    return 0;
}


Этот код демонстрирует сравнение двух строк внутри std::vector без учета регистра с использованием std::lexicographical_compare и функции caseInsensitiveStringCompare. Вы можете настраивать сравнение строк в вашем векторе, используя этот подход.