您的位置:首页 > 其它

STL源码剖析-序列式容器之vector

2017-04-19 16:25 267 查看
1.vector概述

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

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

2.vector的迭代器

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

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;

ac41
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()函数





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: