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來存儲每個緩衝區的地址,因此需要乘以緩衝區大小