SGI-STL简记(五)-工具、杂项解析

utility:
stl_relops.h :
    内部提供了重载模板operator!=、operator>、operator<=、operator>=,而这几个模板函数内部使用到了operator==以及operator<;故只需要模板参数T支持operator==以及operator<,
    便可支持其他的比较操作,而不用都重载一次;
    
stl_pair.h :
    pair struct模板类,仅仅提供两个构造函数,一个默认构造函数,另一个是通过参数依次初始化成员变量first、second;但也暗含了模板参数类型T需隐式或显式支持赋值构造函数;
    此外重载了多种比较运算符、以及一个工具函数make_pair以构造pair对;
    
stl_tempbuf.h :
    临时缓冲区模板类、函数;
    get_temporary_buffer:获取临时缓冲区,内部调用__get_temporary_buffer实现;参数ptrdiff_t len, T*,此处T*只是作为一个类型标识,可不必要;返回类型为pair<T*, ptrdiff_t>其中T*为
    申请到的空间地址,第二个参数为实际分配到的空间大小;最大可申请大小为INT_MAX / sizeof(T);申请策略为:先调整申请大小并申请需求大小空间(内部通过malloc申请),若失败则
    重新减半申请,依次类推直到申请成功或失败为止;
    
    return_temporary_buffer:释放之前申请返回的内存空间(调用free直接释放)(即pair对第一个成员);
    
    _Temporary_buffer:临时缓冲区模板类,模板参数为<class _ForwardIterator, class T>,即提供至少为前向迭代器以及数据类型,数据成员_M_original_len为原始长度,_M_len为申请到的缓冲区长度,
    _M_buffer为申请到的缓冲区首地址;
    构造函数参数为迭代器范围,内部调用distance获取迭代器范围长度以初始化_M_len,此后调用_M_allocate_buffer执行实际的缓冲区申请操作,调用_M_initialize_buffer初始化该缓冲区;
    若申请或初始化过程出现异常,则释放申请成功的缓冲区;
    _M_allocate_buffer:与__get_temporary_buffer实现机制相同,_M_original_len保存原始迭代器范围长度;
    _M_initialize_buffer:重载版本的初始化缓冲区,根据迭代器类型是否需要__true_type内置POD类型或有隐式默认构造函数,若不是则需要用第一个迭代器值并调用uninitialized_fill_n进行初始化;
    析构函数内部调用destroy销毁各个申请缓冲区中的每个对象,而后调用free释放该缓冲区;
    size:获取申请到的缓冲区大小;
    requested_size:获取请求的缓冲区大小;
    begin、end:获取缓冲区首地址和缓冲区尾部地址(类似于新的迭代器范围);
    
    _Temporary_buffer与get_temporary_buffer不同之处在于,前者封装了后者功能且提供更多的操作接口,此外前者通过迭代器范围来申请缓冲区大小以及通过迭代器第一个值初始化该缓冲区;
    
    temporary_buffer:只是简单地继承于_Temporary_buffer,未增加其他操作,一般是给外部直接使用的类;
原文地址:https://www.cnblogs.com/haomiao/p/11647219.html