【STL源码剖析读书笔记】【第4章】序列式容器之vector

1、 vector概述

vector是动态空间,随着元素的加入,它内部机制会自行扩充空间以容纳新元素。

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

2、 vector的迭代器

vector的迭代器是普通指针,支持随机存取,提供的是Random Access Iterators。

template<class T, class Alloc = alloc>
class vector{
public:
	typedef	T	value_type;
	typedef value_type* iterator;//vector的迭代器是普通指针
	...
};

3、vector的数据结构:

vector采用的数据结构是线性连续空间。以两个迭代器start和finish分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端。

template<class T,class Alloc = alloc>
class vector{
...
protected :
	iterator start ; //表示目前使用空间的头
	iterator finish ; // 表示目前使用空间的尾
	iterator end_of_storage ; //表示目前可用空间的尾
};

一个vector的容量永远大于或等于其大小,当容量等于大小时,再增加新元素,便要进行重新配置,移动数据和释放原空间3个过程。

4、push_back()函数

void push_back() {
	if (finish != end_of_storage) {//还有备用空间
		construct(finish);
		++finish;    //调整迭代器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)); //在备用空间起始处构造一个元素,以vector最后一个元素值为其初值
		++finish; //调整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 new_size = old_size != 0 ? 2 * old_size : 1;
		iterator new_start = data_allocator::allocate(new_size);
		iterator new_finish = new_start;
		try{
			new_finish = uninitialized_copy(start, position, new_start);//将原vector的内容拷贝到新vector
			construct(new_finish, x);
			++new_finish;
			new_finish = uninitialzed_copy(position, finish, new_finish);//将安插点的原内容也拷贝过来
		}
		catch (excetion e){
			destroy(new_start, new_finish);//如果发生异常,析构移动的元素,释放新空间
			data_allocator::deallocate(new_start, new_size);
		}//析构并释放原空间
		destroy(begin(), end());
		deallocator();
		start = new_start; //调整迭代器
		finish = new_finish;
		end_of_storage = new_start + new_size;//调整迭代器
	}
}
push_back()函数将新元素插入于vector尾端时,首先检查是否有备用空间,有的话直接在备用空间构造元素并调整迭代器finish,如果没有的话就扩充空间(重新配置,移动数据和释放原空间3个过程),指向原vector的所有迭代器都失效。见图4-2

5、pop_back()函数

void pop_back(){
--finish;
destory(finish);
}

pop_back()函数将尾元素删除时,首先将迭代器finish前移一格,再用destroy()函数销毁尾元素。

6、erase()函数

iterator erase(iterator first,iterator last){//清除区间[first,last)的元素
   iterator  i=copy(last,finish,first);
   destroy(i,finish);
finish=finish-(last-first);
return first;
}
iterator erase(iterator position){ //清除某个位置上的元素
   if(position +1!=end()) 
           copy(position+1,finish,position); 
--finish;
destroy(finish);
return position;
}

7、insert()函数




原文地址:https://www.cnblogs.com/ruan875417/p/4495561.html