容器vector的实现
- vector是一种动态增长的数组,在数组用完的时候,它会自动扩充。没有任何一种东西在内存中可以原地扩充,在当前数组用完后,它会在内存的另一个地方,重新开辟一个当前数组容量二倍大小的数组,将当前的元素全部移过去
2.9版
- vector中有三个指针,start指向vector的起始位置,finish指向vector的最后一个元素,end_of_storage指向容器的最后一个空槽位的下一个位置。
template <class T, class Alloc = alloc>
clsaa vector{
public:
typedef T value_type;
typedef value_type* iterator;
typedef value_type& reference;
typedef size_t size_type;
protected:
iterator start;
iterator finish;
iterator end_of_storage;
public:
iterator begin() { return start; }
iterator end() { return finish; }
size_type size() const
{ return size_type(end() - begin()); }
size_type capacity() const
{ return size_type(end_of_storage - begin()); }
bool empty() const { return begin() == end(); }
reference operator[] (size_type n)
{ return *(begin() + n); }
reference front() { return *begin(); }
reference back() { return *(end() - 1); }
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){
construct(finish, *(finish - 1));
++finish;
T x_copy = x;
copy_backward(position, finish - 2, finish - 1);
*position = 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);
iterator new_finish = new_start;
try{
new_finish = uninitialized_copy(start, position, new_start);
construct(new_finish, x);
++new_finish;
new_finish = uninitialized_copy(position, finish, new_finish);
}
catch(...){
destory(new_start, new_finish);
data_allocator::deallocate(new_start, len);
throw;
}
destory(begin(), end());
deallocate();
start = new_start;
finish = new_finish;
end_of_storage = new_start + len;
}
}
vector 的iterator
- vector的迭代器是指针,在调用萃取器时时返回它的偏特化指针版本
template<class T, class Alloc = alloc>
class vector{
public:
typedef T value_type;
typedef value_type* iterator;
...
};
vector<int> vec;
vector<int>::iterator ite = vec.begin();
iterator_traits<ite>:: iterator_category;
iterator_traits<ite>:: difference_type;
iterator_traits<ite>:: value_type;
4.9版
vector的迭代器
- 迭代器实质上是将指针封装成了对象,对应的是萃取器中的泛化版本