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