C++ STL:vector实现

练习一发,主要是使用placement new在原始内存上创建对象。半路md面试电话来了,赶紧存档,看Java大法

#include <iostream>

#include <cstdlib>

#include <vector>

#include <algorithm>



using namespace std;



class Object {

public:

    static int count;

public:

    int current;

    int id;

    Object(int i) {

        id = i;

        current = count++;

        cout<<"object["<<id<<"] create : "<<current<<endl;

    }

    

    ~Object() {

        cout<<"object["<<id<<"] destroy: "<<current<<endl;

    }



    Object(const Object& obj) {

        current = count++;

        id = obj.id;

        cout<<"object["<<id<<"] copied : "<<current<<" old : "<<obj.current<<endl;

    }

};



int Object::count = 0;



template<class T>

class MyVector {

public:

    typedef T               value_type;

    typedef value_type*     pointer;

    typedef value_type*     iterator;

    typedef value_type&     reference;

    typedef size_t          size_type;

    typedef ptrdiff_t       difference_type;

    

private:

    iterator  start;

    iterator  finish;

    iterator  space_end;

public:

    MyVector() {

        start = NULL;

        space_end = NULL;

        finish = NULL;

    }

    

    size_type capacity() {return space_end - start;}

    size_type size() { return finish - start; }



    bool empty() { return start == finish; }

    iterator begin() {return start;}

    iterator end() {return finish;}

    

    reference operator[] (int idx) {return start[idx];}

    reference front() {return *start;}

    reference back() {return *(finish-1);}

    

    void clear() {



    }

    

    void pop_back() {

        if (start >= finish) {

            return;

        }

        finish--;

        finish->~T();

    }

    

    void push_back(const T& x) {

        if (finish < space_end) {

            // placement new

            new (finish) T(x);

            // adjust end pointer

            finish++;

        } else if (space_end == finish){

            // space not enough

            int olen = finish - start;

            int nlen = olen == 0 ? 1 : olen * 2;

            T* new_start = (T*) malloc(nlen * sizeof(T));

            T* new_finish = new_start;

            for (int i=0; i<olen; i++) {

                // copy old data to new space

                new (new_finish++) T(*(start + i));

            }

            // append pushed element

            new (new_finish++) T(x);



            // deconstruct old ones

            for (int i=0; i<olen; i++) {

                (start+i)->~T();

            }

            free(start);

            

            start = new_start;

            finish= new_finish;

            space_end = start + nlen;

        } else {

            // state invalid

            cerr<<"error"<<endl;

        }

    }

    

    ~MyVector() {

        for (T* s=start; s<finish; s++) {

            s->~T();

        }

        free(start);

    }

};



#define USE_ORG 0

int main() {



    long* a = NULL;

    long* b = a + 1;

    int n = (char*)b - (char*)a;

    

    cout<<n<<endl;

    

    

    

    int last_capacity =-1;

    Object::count = 0;

    

#if USE_ORG

    vector<Object> tmp;

#else

    MyVector<Object> tmp;

#endif



    for (int i=0; i<5; i++) {

        tmp.push_back(Object(i));

        if (last_capacity != tmp.capacity()) {

            cout<<"======last cap:"<<last_capacity<<" new capacity:"<<tmp.capacity()<<endl;

            last_capacity = tmp.capacity();

        }



        cout<<"\n\n"<<endl;

    }



    MyVector<int> ints;

    ints.push_back(2);

    ints.push_back(3);

    ints.push_back(1);

    

    sort(ints.begin(), ints.end());

    

    for (int i:ints) {

        cout<<i<<endl;

    }

    

    system("pause");

    return 0;

}

 

你可能感兴趣的:(vector)