Spec-Zone.ru › C++

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

См. также

strxfrm
преобразовать строку, так чтобы strcmp давало такой же результат, как и strcoll
(функция)
wcsxfrm
преобразовать широкую строку, так чтобы wcscmp давало такой же результат, как и wcscoll
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/locale/collate/transform

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API