SGI-STL简记(九)-字符串(string/wstring)
作者:互联网
char_traits.h : __char_traits_base:字符特性模板基类: 内部重声明了char_type字符类型,int_type整型类型; 此外提供了多个静态成员函数,如: assign:分配函数,将源字符内容赋值给目标字符;此外还有一个重载版本,其将某个字符赋值给指定长度n的字符串缓冲区,即赋值n次(注意目标缓冲区大小不可小于n); eq:相等比较函数,比较两个参数字符内容,相等返回true,否则返回false; lt:小于比较函数,若左参数小于右参数则返回true,否则返回false; compare:比较函数,提供了比较字符串以及字符串比较长度n(两个比较字符串的长度不可比n小,否则可能抛出异常);for循环依次比较各个字符串索引下字符,若均相等则返回true,若前者小于后者返回-1,否则返回1; length;获取字符串长度,其做法为内部构造一个__nullchar,并将其依次与比较字符串的各个字符调用eq比较,直到调用返回true为止(有一个前提是该字符串一定要以结束符结尾,否则可能异常),此时累计长度即为字符串长度; find:查找指定字符串长度n下是否存在某个字符c,内部for依次查找调用eq比较字符串的各字符是否与查找字符c相等,若找到则返回该字符所在字符串的首地址,否则返回0(n不可比字符串的长度大); move:拷贝指定长度的字符串至目标字符串所在缓冲区中,内部调用memmove拷贝实现(其可保证当目标和源区域若存在重叠时也可安全、正确地处理)(注意目标缓冲区一定要足够大,即等于或大于源缓冲区字符串指定大小); copy:类似于move,内部调用memcopy内存拷贝实现,因memcpy不同于memmove,故前者当源和目标缓冲区有重叠时可能有异常,而后者可安全、正确的处理; eof:返回结束标识,内部返回为static_cast<int_type>(-1); eq_int_type:比较两个int_type类型的字符是否相等,若相等返回true,否则返回false; to_int_type:将char_type类型转变为int_type类型,内部使用static_cast<int_type>转换; to_char_type:将int_type类型变为char_type类型,内部使用static_cast<char_type>转换; not_eof:判断指定的int_type值是否不为结束标识,内部构造eof并调用eq_int_type与其比较,若为结束标识则返回0,否则返回该参数值; char_traits :字符特性模板类,继承于__char_traits_base;目前提供的特化版本char_traits<char>、char_traits<wchar_t>; char_traits<char>:char类型的字符特性特化版本,提供给__char_traits_base的整型类型int_type为int;除了基类的静态函数外,当前类也重写了部分实现; to_char_type:将int类型变为char类型,内部使用static_cast<char>(static_cast<unsigned char>(c))转换,即先转化为无符号字符,再转化为字符类型; to_int_type:将char类型转变为int类型,内部使用static_cast<unsigned char>(c)转换,即将字符类型转化为无符号字符类型,再兼容转化为int; compare:比较函数,不再逐个字符比较,而是内部调用memcmp实现,以提高效率; length:获取字符串长度,内部调用C字符串的strlen获取,以提高效率; assign:两个重载版本一起重写,对于将某个字符赋值给指定长度n的字符串缓冲区版本,内部调用memset实现,以提高效率; char_traits<wchar_t>:宽字符的字符特性特化版本,提供__char_traits_base的整型类型int_type为wint_t,其均使用基类的实现; stl_ctraits_fns.h : 主要是实现字符类型特性类对函数对象的封装,主要用于字符串操作相关的算法中; _Eq_traits:字符相等特性函数对象模板类,继承于binary_function;其重载的operator()的内部调用模板参数的eq实现相等比较; _Eq_int_traits:整型相等特性函数对象模板类,继承于binary_function;模板参数分别为char_type, int_type,其重载的operator()的内部先将char_type经to_int_type转化后再调用模板参数的eq_int_type实现相等比较; _Lt_traits:字符小于比较函数对象模板类,继承于binary_function;其重载的operator()的内部调用模板参数的lt实现小于比较; stl_string_fwd.h : 前向声明basic_string模板类,并重声明了basic_string<char>和basic_string<wchar_t>分别为string、wstring类型,外部可直接方便地使用string或wstring; 此外还有__get_c_string静态函数,以获取string字符串的C语言风格格式,其内部调用string的c_str接口; string: _Not_within_traits:字符特性的模板函数对象,继承于unary_function; 其成员变量_M_first、_M_last在其构造函数中初始化,以保存当前将查找的字符串的首尾地址; 成员函数operator()查找指定字符是否在给定的字符串范围_M_first、_M_last内,若存在则返回true,否则返回false;其内部调用find_if查找;此外为了支持find_if的断言函数,采用bind1st左绑定_Eq_traits作为断言函数; _String_alloc_base:字符串分配基类模板;模板参数分别为数据类型T,分配器类型_Allocator,以及一个bool标识_IsStatic(用于区分是否为标准分配器或SGI分配器); 数据成员: _M_data_allocator:分配器对象; _M_start:保存申请的缓冲区首地址(等同于容器元素的首地址); _M_finish:保存容器内容长度时的尾地址; _M_end_of_storage:保存申请的缓冲区尾地址; 成员函数: 构造函数:分配器引用allocator_type类型以初始化_M_data_allocator; get_allocator:获取分配器对象_M_data_allocator; _M_allocate:通过分配器对象_M_data_allocator分配大小为n个的元素类型大小内存空间; _M_deallocate:释放指定数据元素类型指针地址大小为n个数据元素类型大小的内存空间; 此外还提供特化版本_String_alloc_base<_Tp, _Allocator, true>,该分配模板基类内部不再使用分配器对象,而是直接使用simple_alloc的静态成员函数进行分配管理; _String_base:字符串基类,继承于_String_alloc_base,其基类的模板参数_IsStatic则通过_Alloc_traits萃取获得的_S_instanceless来初始化; 构造函数:重载版本,一种通过分配器类型对象初始化;另一种还增加了参数n,内部调用_M_allocate以预先分配n字节的缓冲区并调整_M_start、_M_finish、_M_end_of_storage值; 析构函数:调用_M_deallocate_block释放当前缓冲区;
标签:字符,string,traits,STL,wstring,char,int,字符串,type 来源: https://www.cnblogs.com/haomiao/p/11647262.html