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

Spec-Zone.ru

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