您的位置:首页 > 其它

STL中容器大小的计算

2016-07-24 14:58 459 查看
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来存储每个缓冲区的地址,因此需要乘以缓冲区大小
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: