_deque实现

/*
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;
    }
};
时间: 2024-10-22 05:39:58

_deque实现的相关文章

VII (8) Python(并行开发)

VII8Python(并行开发) In [1]: import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better tha

线程池Python 线程、进程和协程

Python   线程 Threading是用于提供线程相关的操作,线程是应用程序中工作的最小单元.线程与进程的关系下图所示: 子线程是由主线程产生的,但两者并没有关联. 利用threading创建线程: 1 '''利用threading包创建''' 2 import threading 3 import time 4 5 def run(n): 6 time.sleep(2) 7 print("task:",n) 8 9 '''串行:一个运行完后,再运行另外一个''' 10 run(

递归(python)

# -*- coding: utf-8 -*- def fact(n): if n == 0: return 1 else: return n * fact(n - 1) def print_num(n): for i in range(1, n + 1): # print(i) def print_num_recursive(n): if n > 0: print_num_recursive(n - 1) print(n) def print_num_recursive_revserve(n)

第5章 编程范式考察点

面向对象基础及py类常考问题 什么是面向对象编程? Object Oriented Programming(OOP) 把对象作为基本单元, 把对象抽象成类(class) 包含成员和方法 数据封装, 继承, 多态 ? Py中使用类来实现, 过程式编程(函数), OOP(类) Py中如何创建类? class Person(object): #py3 直接class Person def __init__(self, name, age): self.name = name self.age = ag