zoukankan      html  css  js  c++  java
  • 【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()函数




  • 相关阅读:
    Extjs项目使用技巧————文件上传
    项目图片整理
    ExtJs 分组表格控件
    ExtJS实现有机菜单的功能
    ExtJs grid可拖拽行
    ExtJs 分组表格控件----监听
    ExtJS点击添加一个按钮弹出prompt添加combo中
    ExtJS——添加个用户页面
    mysql查询语句个人总结;
    java倒计时器
  • 原文地址:https://www.cnblogs.com/ruan875417/p/4495561.html
Copyright © 2011-2022 走看看