[GeekBand][STL與泛型編程]第一周筆記

Tips:

  1. Generic Programming 將算法和數據結構分開,讓其可以獨立設計。
  2. 所有算法最終就是在比大小。
  3. 操作符重載和模板在STL中占相當重要的位置。
  4. STL是主要是使用 Generic Programming 的方式實現的

1. Befor All

  1. STL六大部件關系


  2. “前閉后開”區間


    STL中的容器均為此類空間。

2. 分配器 allocators

  1. 不建議直接使用,因為其使用方法很不友好。
  2. 作為容器的基礎支持部分,其優劣十分重要,若質量太差會造成效率大幅降低。
  3. C++中所有申請內存都會調用malloc(),而malloc()得到的內存會附帶一定的 overhead ,當數據本身較小時,空間浪費較嚴重。
  4. allocator 最重要的兩個函數:allocatedeallocate。前者申請內存,后者釋放內存。
  5. 多數實現的 allocator 以::operator new()::operator delete()完成allocatedeallocate,沒有任何特殊設計。

實現(以VC6為例)

#ifndef _FARQ
#define _FARQ
#define _PDFT ptrdiff_t
#define _SIZT size_t
#endif
#define _POINTER_X(T,A) T_FARQ*
#define _REFERENCE_X(T,A) T_FARQ&
template<typename _Ty>
class allocator
{
public:
    typedef _SIZT size_type;
    typedef _PDFT difference_type;
    typedef _Ty _FARQ *pointer;
    typedef _Ty value_type;
    pointer allocate(size_type _N, const void *)
    { return (_Allcoate(difference_type(_N), pointer(0))); }
    void deallocate(void _FARQ *_P, size_type)
    { operator delete(_P); }
};
template<typename _Ty>
inline _Ty _FARQ *_Allocate(_PDFT _N, _Ty _FARQ *)
{
    if (_N < 0)
        _N = 0;
    return (_Ty _FARQ *)operator new(_SIZT(_N) * sizeof(_Ty));
}

3. 容器之間的實現關系

4. 容器 list

5. 迭代器 iterator 和 Iterator Traits

  1. 五個必須的typedef
    A. iterator_category:記錄 iterator 的分類
    B. value_type:記錄數據類型
    C. pointer:記錄數據指針
    D. reference:記錄數據引用
    E. difference_type:記錄指針距離的類型
  2. 重載++、--操作符時:用operator++()、operator--()表示前置++、--;用operator++(int)operator--(int)表示后置++、--。
  3. 指針被視為一種退化的 iterator 。算法想要提取 iterator 的特征時可以通過 iterator traits 來識別指針和 iterator ,進而由 iterator traits回答算法。
    實現

6. 容器 vector

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容