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/w/cpp/locale/collate/transform