Boolan微专业-STL与泛型编程(Week02)

2018-02-18  本文已影响0人  GoMomi

STL与泛型编程

主要内容:

简单介绍了 OOP 和 GP 编程。详细剖析了 STL 中的分配器、list、Iterator、vector、array、forward_list

OOP(Object-Oriented Programming 面向对象编程) vs. GP(Generic Programming 泛型编程)

OOP

GP

分配器

分配器是容器管理内存的工具,对于容器的效率起着比较重要的作用

容器结构分类

序列式容器(Sequence Container)的衍生关系

关联式容器(Associative Containers)的衍生关系(复合)

容器 list

template <class T>
struct __list_node{
    typedef void* void_pointer;
    void_pointer prev;
    void_pointer next;
    T data;
};

template<class T, class Alloc = alloc>
class list{
protected:
    typedef __list_node<T> list_node;
public:
    typedef list_node* link_type;
    typedef __list_iterator<T, T&, T*> iterator;
protected:
    link_type node;
};

template<class T, class Ref, class Ptr>
struct __list_iterator{
    typedef T value_type;
    typedef Ptr pointer;
    typedef Ref reference;
}

Iterator 的设计原则

算法要求这几项的类型必须指定出来

容器Vector

void push_back()(const T& x)
{
    if(finish != end_of_storage){//尚有备用空间
        construct(finish, x); 
        ++finish; 
    }
    else{
        insert_aux(end(), x);
    }
}


template<class T, class Alloc>
void vector<T, Alloc>::insert_aux(iterator position, const T& x){
    if(finish != end_of_storage){//空间够用
        //在备用空间起始处建一个元素,并以vector最后一个元素为其初值
        construct(finish, *(finish - 1);
        ++finish;
        T x_copy = x;
        copy_backward(postion, finish - 2, finish - 1);
        *postion = x_copy;
    }
    else{  //空间不够用
        const size_type old_size = size();
        const size_type len = old_size != 0? 2*old_size: 1;
        iterator new_start = data_allocator::allocate(len);
        //以上分配原则:剐原大小为0,分配1;不为0,分配原大小的两倍;前半段用来放置原数据,后半段用来放置新数据
        iterator new_finish = new start;
        try{
            //将原vector的内容拷贝到新的vector
            new_finish = uninitialized_copy(start, position, new_start);
            construnct(new_finish, x);//为新元素设置初值x
            ++new_finish;
            //拷贝安插点后的原内容
            new_finish = uninitialized_copy(postion, finish, new_finish);
        }
        catch(...){
              destory(new_start, new_finish);
            data_allocator::deallocate(new_start, len);
          throwl
        }
        //析构并释放元vector
        destory(begin(), end());
        //调整迭代器,指向新的vector
        deallocate();
        start = new_start;
        finish = new_finish;
        end_of_storage = new_start + len;
    }
}

容器array

    template<typename _Tp, std::size_t _Nm>
    struct array{
    typedef _Tp;
    typedef _Tp*;
    typedef value_type*;
    
    value_type _M_instance[_Nm? _Nm: 1];
    iterator begin(){
        return iterator(&_M_instance[0]);
    }
    iterator end(){
        return iterator(&_M_instance[_Nm]);
    }
  }

forward_list

上一篇 下一篇

猜你喜欢

热点阅读