本文主要是介绍STL源码分析之vector容器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
vector与array非常相似,两者唯一差别在于空间运用的灵活性
array是静态空间,一旦配置了就不能改变;若要改变使用的空间大小,一切琐碎由客户端自己来处理:先配置新空间,然后将元素从旧址一一搬到新址去,在退还原来的空间
vector则是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新的元素
以下为sgi vector源码:
//alloc即为之前讲过的空间配置器
template <class T, class Alloc = alloc>
class vector {
public:typedef T value_type;typedef value_type* pointer;typedef const value_type* const_pointer;typedef value_type* iterator; //可以看到,这里iterator直接就是指针typedef const value_type* const_iterator;typedef value_type& reference;typedef const value_type& const_reference;typedef size_t size_type;typedef ptrdiff_t difference_type;protected://声明一个空间配置器对象typedef simple_alloc<value_type, Alloc> data_allocator;iterator start; //目前使用空间的开头iterator finish; //目前使用空间的尾部iterator end_of_storage; //目前可用空间的尾部void insert_aux(iterator position, const T& x); //此函数将对象x插入到某个位置上,且此函数负责改变vector的大小void deallocate() {//直接将整个vector释放if (start) data_allocator::deallocate(start, end_of_storage- start);}void fill_initialize(size_type n, const T& value) {start = allocate_and_fill(n, value);finish = start + n;end_of_storage = finish;}
public:iterator begin() { return start; }iterator end() { return finish; }size_type size() const { return size_type(end() -begin()); }size_type capacity() const { returnsize_type(end_of_storage - begin()); }bool empty() const { return begin() == end(); }reference operator[](size_type n) { return *(begin() + n); }//构造函数vector() : start(0), finish(0),end_of_storage(0) {}vector(size_type n, const T& value) {fill_initialize(n, value); }vector(int n, const T& value) {fill_initialize(n, value); }vector(long n, const T& value) {fill_initialize(n, value); }
这篇关于STL源码分析之vector容器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!