collate 类

一种描述对象的类模板,该对象可作为区域设置 facet,以控制字符串中字符的排序和分组、字符之间的比较以及字符串的哈希处理。

语法

template <class CharType>
class collate : public locale::facet;

参数

CharType
在程序中用于对字符进行编码的类型。

注解

对于任何区域设置 facet,静态对象 ID 的初始存储值为零。 首次尝试访问其存储值后,将在 id 中存储唯一正值。 在某些语言中,多个字符作为单个字符分组和处理,在其他语言中,单个字符被作为两个字符进行处理。 通过排序规则类提供的排序规则服务,可以在这些情况下进行排序。

构造函数

构造函数 说明
collate 用作区域设置 facet 以处理字符串排序转换的 collate 类的对象的构造函数。

Typedef

类型名称 说明
char_type 一种类型,此类型描述 CharType 类型字符。
string_type 一种类型,此类型描述包含 basic_string 类型字符的 CharType 类型字符串。

成员函数

成员函数 说明
compare 根据两个字符序列的特定于 facet 的规则,比较这两个字符序列是否相等。
do_compare 一种虚拟函数,通过调用此函数可根据两个字符序列的特定于 facet 的规则来比较这两个序列是否相等。
do_hash 一种虚拟函数,通过调用此函数可根据序列的特定于 facet 的规则来确定它们的哈希值。
do_transform 一种虚拟函数,通过调用此函数可将字符序列从区域设置转换为字符串,可使用此字符串与以类似方式从同一区域设置转换的其他字符序列按字典顺序进行比较。
hash 根据序列的特定于 facet 的规则来确定它们的哈希值。
transform 将字符序列从区域设置转换为字符串,可使用此字符串与以类似方式从同一区域设置转换的其他字符序列按字典顺序进行比较。

要求

标头:<locale>

命名空间: std

collate::char_type

一种类型,此类型描述 CharType 类型字符。

typedef CharType char_type;

备注

该类型是模板参数 CharType 的同义词。

collate::collate

用作区域设置 facet 以处理字符串排序转换的 collate 类的对象的构造函数。

public:
    explicit collate(
    size_t _Refs = 0);

protected:
    collate(
const char* _Locname,
    size_t _Refs = 0);

参数

_Refs
用于指定对象的内存管理类型的整数值。

_Locname
区域设置的名称。

注解

_Refs 参数可能的值及其含义

  • 0:对象的生存期由包含该对象的区域设置管理。

  • 1:必须手动管理对象的生存期。

  • > 1:未定义这些值。

构造函数通过 locale::facet(_Refs) 初始化其基对象。

collate::compare

根据两个字符序列的特定于 facet 的规则,比较这两个字符序列是否相等。

int compare(const CharType* first1,
    const CharType* last1,
    const CharType* first2,
    const CharType* last2) const;

参数

first1
指向第一个序列中要比较的第一个元素的指针。

last1
指向第一个序列中要比较的最后一个元素的指针。

first2
指向第二个序列中要比较的第一个元素的指针。

last2
指向第二个序列中要比较的最后一个元素的指针。

返回值

此成员函数返回:

  • 如果第一个序列小于第二个序列,则为 -1。

  • 如果第一个序列大于第二个序列,则为 +1。

  • 如果两个序列相等,则为 0。

注解

如果序列中的最早不相等对存在较小元素,或如果不存在不相等对,但第一个序列长度较短,则第一个序列相对较小。

成员函数返回 do_compare( first1, last1, first2, last2)。

示例

// collate_compare.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <tchar.h>
using namespace std;

int main() {
   locale loc ( "German_germany" );
   _TCHAR * s1 = _T("Das ist wei\x00dfzz."); // \x00df is the German sharp-s, it comes before z in the German alphabet
   _TCHAR * s2 = _T("Das ist weizzz.");
   int result1 = use_facet<collate<_TCHAR> > ( loc ).
      compare ( s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << result1 << endl;

   locale loc2 ( "C" );
   int result2 = use_facet<collate<_TCHAR> > ( loc2 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << result2 << endl;
}

collate::do_compare

一种虚拟函数,通过调用此函数可根据两个字符序列的特定于 facet 的规则来比较这两个序列是否相等。

virtual int do_compare(const CharType* first1,
    const CharType* last1,
    const CharType* first2,
    const CharType* last2) const;

参数

first1
指向第一个序列中要比较的第一个元素的指针。

last1
指向第一个序列中要比较的最后一个元素的指针。

first2
指向第二个序列中要比较的第一个元素的指针。

last2
指向第二个序列中要比较的最后一个元素的指针。

返回值

此成员函数返回:

  • 如果第一个序列小于第二个序列,则为 -1。

  • 如果第一个序列大于第二个序列,则为 +1。

  • 如果两个序列相等,则为 0。

注解

受保护的虚拟成员函数将 [ * first1, Last1)* 中的序列与 [ first2, last2) 中的序列进行比较。 它通过在类型 CharType 的相应元素之间应用 operator< 来比较值。 如果序列中的最早不相等对存在较小元素,或如果不存在不相等对,但第一个序列长度较短,则第一个序列相对较小。

示例

请参阅 collate:: compare 的示例,它调用 do_compare

collate::do_hash

一种虚拟函数,通过调用此函数可根据序列的特定于 facet 的规则来确定它们的哈希值。

virtual long do_hash(const CharType* first, const CharType* last) const;

参数

first
一个指向序列中具有待定值的第一个字符的指针。

last
一个指向序列中具有待定值的最后一个字符的指针。

返回值

针对序列的类型 long 的哈希值。

备注

哈希值可用于在列表数组中伪随机分布序列等。

示例

请参阅 hash 的示例,它调用do_hash

collate::do_transform

一种虚拟函数,通过调用此函数可将字符序列从区域设置转换为字符串,可使用此字符串与以类似方式从同一区域设置转换的其他字符序列按字典顺序进行比较。

virtual string_type do_transform(const CharType* first, const CharType* last) const;

参数

first
指向序列中要转换的第一个字符的指针。

last
指向序列中要转换的最后一个字符的指针。

返回值

一个字符串,为转换后的字符序列。

注解

受保护的虚拟成员函数将返回 string_type 类的对象,其受控的序列是序列 [ first, last) 的副本。 如果一个派生自 collate<CharType> 的类替代 do_compare,则还应重写 do_transform 以进行匹配。 传递给 collate::compare 时,两个已转换的字符串应产生相同的结果,你会从传递未经转换的字符串中获得此结果以在派生类中进行比较。

示例

请参阅 transform 的示例,它调用 do_transform

collate::hash

根据序列的特定于 facet 的规则来确定它们的哈希值。

long hash(const CharType* first, const CharType* last) const;

参数

first
一个指向序列中具有待定值的第一个字符的指针。

last
一个指向序列中具有待定值的最后一个字符的指针。

返回值

针对序列的类型 long 的哈希值。

注解

成员函数返回 do_hash( first, last)。

哈希值可用于在列表数组中伪随机分布序列等。

示例

// collate_hash.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <tchar.h>
using namespace std;

int main( )
{
   locale loc ( "German_germany" );
   _TCHAR * s1 = _T("\x00dfzz abc."); // \x00df is the German sharp-s (looks like beta), it comes before z in the alphabet
   _TCHAR * s2 = _T("zzz abc."); // \x00df is the German sharp-s (looks like beta), it comes before z in the alphabet

   long r1 = use_facet< collate<_TCHAR> > ( loc ).
      hash (s1, &s1[_tcslen( s1 )-1 ]);
   long r2 =  use_facet< collate<_TCHAR> > ( loc ).
      hash (s2, &s2[_tcslen( s2 )-1 ] );
   cout << r1 << " " << r2 << endl;
}
541187293 551279837

collate::string_type

一种类型,此类型描述包含 basic_string 类型字符的 CharType 类型字符串。

typedef basic_string<CharType> string_type;

备注

此类型描述 basic_string 模板类的专用化,该模板类的对象可存储源序列的副本。

示例

有关如何声明和使用 string_type 的示例,请参阅 transform

collate::transform

将字符序列从区域设置转换为字符串,可使用此字符串与以类似方式从同一区域设置转换的其他字符序列按字典顺序进行比较。

string_type transform(const CharType* first, const CharType* last) const;

参数

first
指向序列中要转换的第一个字符的指针。

last
指向序列中要转换的最后一个字符的指针。

返回值

一个字符串,包含已转换的字符序列。

备注

成员函数返回 do_transformfirstlast)。

示例

// collate_transform.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <tchar.h>
using namespace std;

int main( )
{
   locale loc ( "German_Germany" );
   _TCHAR* s1 = _T("\x00dfzz abc.");
   // \x00df is the German sharp-s (looks like beta),
   // it comes before z in the alphabet
   _TCHAR* s2 = _T("zzz abc.");

   collate<_TCHAR>::string_type r1;   // OK for typedef
   r1 = use_facet< collate<_TCHAR> > ( loc ).
      transform (s1, &s1[_tcslen( s1 )-1 ]);

   cout << r1 << endl;

   basic_string<_TCHAR> r2 = use_facet< collate<_TCHAR> > ( loc ).
      transform (s2, &s2[_tcslen( s2 )-1 ]);

   cout << r2 << endl;

   int result1 = use_facet<collate<_TCHAR> > ( loc ).compare
      (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );

   cout << _tcscmp(r1.c_str( ),r2.c_str( )) << result1
      << _tcscmp(s1,s2) <<endl;
}

-1-11

另请参阅

<区域设置>
C++ 标准库中的线程安全