码迷,mamicode.com
首页 > 其他好文 > 详细

_deque实现

时间:2015-01-15 14:11:13      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

/*
deque是一种双向开口的连续线性空间,可以在头尾两端分别做元素的插入和删除操作

deque与vector差异:
1.deque允许于常数时间内对头部进行元素的插入和移除操作
2.deque没有容量(capacity)概念,由分段连续空间组合而成,随时可以增加一段新的空间并链接起来,
而vector当空间不足时,需要重新配置一块更大空间,然后复制元素,再释放旧空间

注意:deque的迭代器不是普通指针,操作复杂度比vector迭代器要大,所以应尽可能选择使用vector
对deque进行的排序操作,为了最高效率,可将deque复制到vector,将vector排序后,再复制回deque
*/

/*
deque采用一小块连续空间,其中每个元素都是指针,指向另一段较大的连续线性空间,称为缓冲区,缓冲区是
deque的储存空间主体,SGI STL允许我们指定缓冲区大小,默认值0表示将使用512bytes缓冲区
*/

template <class T,class Alloc=alloc,size_t BufSiz=0>
class deque
{
public:
    typedef T value_type;
    typedef value_type* pointer;
    typedef _deque_iterator<T, T&, T*, BufSiz> iterator;
    //...

protected:
    typedef pointer* map_pointer;
    typedef size_t size_type;
    map_pointer map;//指向map,map是块连续空间,其内的每个元素都是一个指针,指向一块缓冲区
    size_type map_size;//map内可容纳指针数
    iterator start;//指向第一个缓冲区的第一个元素
    iterator finish;//指向最后缓冲区的最后一个元素的下一位置
    
};

//迭代器实现
template<class T,class Ref,class Ptr,size_t BufSiz>
struct _deque_iterator
{
    typedef _deque_iterator<T, T&, T*, BufSiz> iterator;
    typedef _deque_iterator<T, const T&, const T*, BufSiz>const_iterator;

    //未继承iterator
    typedef random_access_iterator_tag iterator_category;
    typedef T value_type;
    typedef Ptr pointer;
    typedef Ref reference;
    typedef size_t size_type;
    typedef ptrdiff_t difference_type;
    typedef T** map_pointer;

    typedef _deque_iterator self;
    
    //每个迭代器指向一个缓冲区
    T* cur;//该迭代器所指的缓冲区中的当前元素
    T* first;//该迭代器所指的缓冲区的头
    T* last;//该迭代器所指的缓冲区的尾
    map_pointer node;//指向map空间中指向对应缓冲区的结点

    //返回缓冲区中元素个数
    static size_t buffer_size();

    //当迭代器行进时遇到缓冲区边缘,需要调用set_node()跳一个缓冲区
    void set_node(map_pointer new_node)
    {
        //new_node指向新缓冲区
        node = new_node;
        first = *new_node;
        last = first + difference_type(buffer_size());

    }

    reference operator*()const
    {
        return *cur;
    }

    pointer operator->()const
    {
        return &(operator*());
    }

    difference_type operator-(const self &x)const
    {
        return difference_type(buffer_size())*(node - x.node - 1) + (cur - first) + (x.last - x.cur);
    }
    //前置
    self& operator++()
    {
        ++cur;
        if (cur == last)
        {
            set_node(node + 1);
            cur = first;
        }
        return *this;
    }
    //后置
    self operator++(int)
    {
        self tmp = *this;
        ++*this;//调用上面的++
        return tmp;
    }
    self& operator--()
    {
        if (cur == first)
        {
            set_node(node - 1);
            cur = last;
        }
        --cur;
        return *this;
    }
    self operator--(int)
    {
        self tmp = *this;
        --*this;
        return tmp;
    }
};

 

_deque实现

标签:

原文地址:http://www.cnblogs.com/ljygoodgoodstudydaydayup/p/4226158.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!