STL中容器大小的計算

1、vecotr

    class vector { 
         public: 
                  size_type size() const 
                   { return size_type(end() – begin()); } 
                  iterator begin() { return _M_start; } 
                  iterator end() { return _M_finish; } 
         protected: 
              _Tp* _M_start; 
              _Tp* _M_finish; 
              _Tp* _M_end_of_storage; 
      };

常量時間
2、list

 class list{ 
         public: 
            size_type size() const { 
                size_type __result = 0; 
                distance(begin(), end(), __result); 
                return __result; 
              } 
 };
template <class _InputIterator, class _Distance> 
      inline void distance(_InputIterator __first, _InputIterator __last, _Distance& __n) 
      { 
           __STL_REQUIRES(_InputIterator, _InputIterator); 
           __distance(__first, __last, __n, iterator_category(__first)); 
      } 

      template <class _InputIterator, class _Distance> 
      inline void __distance(_InputIterator __first, _InputIterator __last, _Distance& __n, input_iterator_tag) 
      { 
           while (__first != __last) { ++__first; ++__n; } 
      }

需要遍歷整個鏈表
3、dequeue

 class deque { 
          public: 
               size_type size() const { return _M_finish – _M_start; } 
         protected: 
              iterator _M_start; 
              iterator _M_finish; 
 };
  struct _Deque_iterator { 
            typedef _Deque_iterator<_Tp, _Tp&, _Tp*>             iterator; 
            typedef ptrdiff_t difference_type; 
            typedef _Deque_iterator _Self; 

            difference_type operator-(const _Self& __x) const { 
                return difference_type(_S_buffer_size()) * (_M_node – __x._M_node – 1) + 
                     (_M_cur – _M_first) + (__x._M_last – __x._M_cur); 
             } 
       };

迭代器中重載“-”,因爲deque採用了一個map來存儲每個緩衝區的地址,因此需要乘以緩衝區大小

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章