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