关于 cpp 五大函数及 vector 的感知

五大函数:

析构函数

拷贝构造函数

移动构造函数

拷贝赋值 Operator=

移动赋值 Operator=


 

析构函数

只要一个对象运行越出范围,

或经受一次 delete,

则析构函数就要被调用

 

对于 Intcell,这些操作的形式是:

~Intcell();          //析构函数
Intcell(const Intcell &rhs);        //拷贝构造函数
Intcell(Intcell &&rhs);             //移动构造函数
Intcell &operator=(const Intcell &rhs);      //拷贝函数
Intcell &operator=(Intcell &&rhs);           //移动函数

 

vector 的实现

概述:

1.vector 将(通过一个指向所分配的内存块的指针变量)保留原始的数组,数组容量以及数组当时存储在 vector 中的项数。

2.该 vector 将实现五大函数以提供为拷贝构造函数 和 operator= 的深层拷贝功能,并将提供一个析构函数以回收原始数组。此外,它还将实现 c++11的移动功能。

3.vector 将提供改变 vector 的大小(一般改成更大的数)的 resize 例程,以及 reserve 例程,后者将改变 vecotr 的容量(一般是更大的数)。这个容量通过为原始数组获取新的内存块,把老内存块复制到新内存块并回收老内存块而得以更新。

4.vector 将提供operator[] 的实现。

5.vector 将提供size ,empty ,clear ,back ,pop_back ,push_back等基本例程。

6.对于内嵌函数提供支持。

 

#include <algorithm>
template <typename object>
class vector{
    public:
    explicit vector(int initsize=0):thesize(initsize),
    thecapacity{initsize+spare_capacity}
    {
        objects = new object[thecapacity];
    }

    vector(const vector &rhs):thesize{rhs.thesize},
    thecapacity{rhs.thecapacity},objects{nullptr}{
        objects = new object[thecapacity];
        for (int k = 0; k < thesize;++k)
            objects[k] = rhs.objects[k];
    }

    vector & operator= (const vector &rhs)
    {
        vector copy = rhs;
        std::swap(*this, copy);
        return *this;
    }

    ~vector() {
        delete[] objects;
    }

    vector(vector && rhs):thesize{rhs.thesize},
    thecapacity{rhs.thecapacity},objects{rhs.objects}{
        rhs.objects = nullptr;
        rhs.thesize = 0;
        rhs.thecapacity = 0;
    }

    vector & operator=(vector && rhs){
        std::swap(thesize, rhs.thesize);
        std::swap(thecapacity, rhs.thecapacity);
        std::swap(objects, rhs.objects);

        return *this;
    }

    void resize(int newsize){
        if(newsize>thecapacity)
            reserve(newsize * 2);
        thesize = newsize;
    }

    void reserve(int newcapacity){
        if(newcapacity<thesize)
            return;
        object *newarray = new object[newcapacity];
        for (int k = 0; k < thesize;++k)
            newarray[k] = std::move(objects[k]);
        thecapacity = newcapacity;
        std::swap(objects, newarray);
        delete []newarray;
    }

    objcet & operator[](int index){
        return objects[index];
    }

    const object & operator[](int index)const{
        return objects[index];
    }

    bool empty()const{
        return size() == 0;
    }

    int size()const{
        return thesize;
    }

    int capacity()const{
        return thecapacity;
    }

    void push_back(const object &x){
        if(thesize == thecapacity)
            reserve(2 * thecapacity + 1);
        object[thesize++] = x;
    }

    void push_back(object && x){
        if(thesize == thecapacity)
        reserve(2 * thecapacity + 1);
        object[thesize++] = std::move(x);
    }

    void pop_back(){
        --thesize;
    }

    const object & back()const{
        return objects[thesize - 1];
    }

    typedef object * iterator;
    typedef const object * const_iterator;

    iterator begin(){
        reutrn &objects[0];
    }

    const_iterator begin()const{
        return &objects[0];
    }

    iterator end(){
        return &objects[size()];
    }

    const_iterator end()const{
        return &objects[size()];
    }
    
    static const int spare_capacity = 16;

    private:
        int thesize;
        int thecapacity;
        object *objects;
};

 

上一篇:C++中 =defaule 和 =delete什么意思


下一篇:[Gym 101234D] Forest Game 简要题解