std::collate<CharT>::transform, do_transform
Определён в заголовочном файле <locale> | ||
|---|---|---|
public: string_type transform( const CharT* low, const CharT* high ) const; | (1) | |
protected: virtual string_type do_transform( const CharT* low, const CharT* high ) const; | (2) |
1) Публичная функция-член, вызывающая защищённую виртуальную функцию-член
do_transform наиболее производного класса.
2) Преобразует последовательность символов
[low, high) в строку, которая при лексикографическом сравнении (например, с помощью operator< для строк) с результатом вызова transform() для другой строки даёт тот же результат, что и вызов do_compare() для тех же двух строк.Параметры
| low | - | указатель на первый символ последовательности, которую необходимо преобразовать |
| high | - | указатель на позицию сразу за концом последовательности, которую необходимо преобразовать |
Возвращаемое значение
Строка, преобразованная таким образом, что лексикографическое сравнение преобразованных строк можно использовать вместо сортировки исходных строк. В локали "C" возвращаемая строка является точной копией [low, high). В других локалях содержимое возвращаемой строки определяется реализацией, а её размер может быть значительно больше.
Примечания
Помимо использования при сортировке, специфичный для реализации формат преобразованной строки известен функции std::regex_traits<>::transform_primary, которая может извлекать информацию о классе эквивалентности.
Пример
#include <iomanip>
#include <iostream>
#include <locale>
int main()
{
std::locale::global(std::locale("sv_SE.utf8"));
auto& f = std::use_facet<std::collate<wchar_t>>(std::locale());
std::wstring in1 = L"\u00e4ngel";
std::wstring in2 = L"\u00e5r";
std::wstring out1 = f.transform(&in1[0], &in1[0] + in1.size());
std::wstring out2 = f.transform(&in2[0], &in2[0] + in2.size());
std::wcout << "In the Swedish locale: ";
if (out1 < out2)
std::wcout << in1 << " before " << in2 << '\n';
else
std::wcout << in2 << " before " << in1 << '\n';
std::wcout << "In lexicographic comparison: ";
if (in1 < in2)
std::wcout << in1 << " before " << in2 << '\n';
else
std::wcout << in2 << " before " << in1 << '\n';
}
Вывод:
In the Swedish locale: år before ängel In lexicographic comparison: ängel before år
См. также
преобразует строку так, чтобы strcmp давал тот же результат, что и strcoll (функция) |
|
преобразует широкую строку так, чтобы wcscmp давал тот же результат, что и wcscoll (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/locale/collate/transform