STL之vector

vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率

template<class T, class Alloc = alloc>
class vector
{
public:
    typedef T* iterator;
protected:
    iterator start;
    iterator finish;
    iterator end_of_storate;
    void fill_initialize(size_type n, const T& value)
    {
        start = allocate_and_fill(n, value);
        finish = start + n;
        end_of_storage = finish;
    }
public:
    vector(): start(0), end(0), end_of_storage(0){}
    vector(int n, const T& value){ fill_initialize(n, value); } 
    explicit vector(size_type n){ fill_initialize(n, T()); }
vector(const vector<T, Alloc>& x)
{
start = allocate_and_copy(x.end()-x.begin(), x.begin(), x.end());
finish = start + (x.end()-x.start());
end_of_storage = finish;
}

void reverse(size_type n)
{
if(capacity() < n)
{
const size_type old_size = size();
itertor tmp = allocate_and_copy(n, start, finish);
destroy(start, finish);
deallocate();
start = tmp;
finish = start + old_size;
end_of_storage = start + n;
}
}

void push_back(const T& x)
{
if(finish != end_of_storage)
{
construct(finish, x);
++finish;
}
else
{
const size_type old_size = size();
const size_type len = old_size != 0 ? 2*old_size : 1;
iterator new_start = data_allocate::allocate(len);
iterator new_finish = new_start;
new_finish = uninitialized_and_copy(start, finish, new_start);
construt(new_finish, x);
++new_finish;
destroy(start, finish);
deallocate();
start = new_start;
finish = new_finish;
end_of_storage = start + len;
}
}

void resize(size_type new_size)
{
if(new_size < size())
erase(begin()+new_size, end());
else
insert(end(), new_size-size(), T());
} };

 

posted @ 2015-03-15 16:09  啊哈灵机一动  阅读(102)  评论(0)    收藏  举报