zoukankan      html  css  js  c++  java
  • 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释放当前缓冲区;    
  • 相关阅读:
    python模块之random模块
    python模块之os模块
    python模块之collections模块
    python模块之re模块
    python基础十五之递归函数
    python基础十四之匿名函数
    python基础十三之内置函数
    leetcode 108 和leetcode 109 II
    leetcode 108 和leetcode 109
    对于final修饰的类型运算时的表现
  • 原文地址:https://www.cnblogs.com/haomiao/p/11647262.html
Copyright © 2011-2022 走看看