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());
} };

浙公网安备 33010602011771号