vector源码1(参考STL源码--侯捷)

vector源码2(参考STL源码--侯捷)

vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效

vector概述

Vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间纳入新元素,vector的使用效率,关键在于其对大小的控制以及重新配置时的元素迁移效率。

Vector定义摘要

template <class T,class Alloc=alloc>//alloc是SGI STL的空间配置器

class vector

{

public:

typedef T   value_type;

typedef value_type*  pointer;

typedef value_type*  iterator;

typedef value_type&  reference;

typedef size_t   size_type;

typedef ptrdiff_t       difference_type;

protected:

typedef simple_alloc<value_type,Alloc> data_allocator;//simple_alloc是SGI STL的空间配置器

iterator start; //表示目前使用空间的头

iterator finish; //表示目前使用空间的尾

iterator end_of_storage; //表示目前可用空间的尾

void insert_aux(iterator position,const T& x);//插入元素,保护类型,对象不可调用

void deallocate(){

if(start)

/*为vector再分配空间为其原始可容纳空间的一倍,deallocate()函数如下:

*static void deallocate(T *p,size_t n)

{if(0!=n) Alloc::deallocate(p,n*sizeof(T));}

*/

data_allocator::deallocate(start,end_of_storage-start);

}

void fill_initialize(size_type n,const T& value){//用于vector初始赋值

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{return size_type(end_of_storage-begin());}//当前可容纳元素

bool empty() const{return begin()==end();}//是否为空

reference operator[](size_type n){return *(begin()+n);}//定位元素,返回第n+1个元素

vector():start(0),finish(0),end_of_storage(0){}//初始化,如:vector<int> v;

/*size_type是STL类中定义的类型属性,用以保存任意string和vector类对象的长度,

以下都为初始化vector,如:vector<int> v(10,1)*/

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);}

//explit 防止隐式转换,此时初始化如:vector<int> v(10);

explicit vector(size_type n){fill_initialize(n,T());}

~vector(){   /*全局函数,destory()有两个版本,第一个版本接收一个指针,准备将该指针指向的对象析构掉;

第二个版本就是接收first和last两个迭代器(如下),将[first,last]下的对象析构掉。

在第二个版本下,如果析构对象的析构函数需要执行,会调用一个版本的destory(),否则直接

析构掉该对象,这里需要用到value_type()进行判断。

*/

destory(start,finish);

deallocate();  //vector的成员函数

}

reference front(){return *begin();}//返回第一个数

reference back(){return *(end()-1);}//返回最后一个数

void push_back(const T& x)//添加元素

{

if(finish !=end_of_storage){//是否超出最大可容纳空间

/*全局函数,construct()接收一个指针p和一个初值value,该函数的用途就是将

初值value设定到指针锁指的空间上。

*/

construct(finish,x);

++finish;

}

else{

insert_aux(end(),x);  //vector的成员函数

}

}

void pop_back(){

--finish();

destroy(finish()); //调用第一类destory()函数,详细见上

}

iterator erase(iterator position){//擦除一个元素

if(position+1!=end())//不是擦除最后一个元素

copy(position+1,finish,position);//将元素前移,覆盖掉要擦除的元素

--finish;

destroy(finish);//销毁最后一个元素

return position;

}

void resize(size_type new_size(),const T& x){

if(new_size<size())

earse(begin()+new_size,end());//擦除掉第new_size()个数(0为第一个数)

else

insert(end(),new_size-size(),x);//用x补全vector长度为new_size()

}

void resize(size_type new_size) {resize(new_size,T());}//同上,补全数字为0

void clear(){earse(begin(),end());}//擦除所有元素

protected:

//配置空间,并填满内存

iterator allocate_and_fill(size_type n,const T& x){

iterator result=data_allocator::allocate(n);

/*全局函数,uninitialized_fill_n()有3个参数:

*迭代器first指向欲初始化空间的地址的起始处

*初始化空间的大小n

*初始化的值x

*/

uninitialized_fill_n(result,n,x);

return result;

}

};

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-size: 10.5000pt }
p.pre { margin: 0pt; margin-bottom: .0001pt; text-align: left; font-family: "Courier New"; font-size: 10.0000pt }
span.msoIns { text-decoration: underline; color: blue }
span.msoDel { text-decoration: line-through; color: red }
div.Section0 { }
p,li { white-space: pre-wrap }

原文地址:https://www.cnblogs.com/ybf-yyj/p/9609799.html

时间: 2024-11-11 04:18:11

vector源码1(参考STL源码--侯捷)的相关文章

vector源码2(参考STL源码--侯捷)

vector源码1(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector的构造和内存管理 vector所采用的数据结构非常简单:线性连续空间,它是由两个迭代器start和finish分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端: class vector //详细源码可见 { .......... protected: typedef simple_allo

list源码4(参考STL源码--侯捷):transfer、splice、merge、reverse、sort

list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL源码--侯捷):push_front.push_back.erase.pop_front.pop_back.clear.remove.unique list源码4(参考STL源码--侯捷):transfer.splice.merge.reverse.sort transfer list内部提供一个所

list源码1(参考STL源码--侯捷):list节点、迭代器、数据结构

list概述 list相对于vector复杂得多,list是一个双链表,对于插入元素.删除元素,list都相对比较简单 list节点 template <class T> struct __list_node{ typedef void* void_pointer; void_pointer prev; //类型为void*,其实也可以设置为__list_node<T>* void_pointer next; T data; }; list迭代器 list迭代器必须有能力指向lis

list源码2(参考STL源码--侯捷):constructor、push_back、insert

list的push_back.insert的使用如下: #include<bits/stdc++.h> using namespace std; int main() { int i; list<int> l; cout<<l.size()<<endl; //0 l.push_back(1); l.push_back(3); l.push_back(5); l.push_back(7); l.push_back(9); cout<<l.size(

vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效

vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) #include<bits/stdc++.h> using namespace std; int main(){ vector<int> v(3,3); vector<int>::iterator it=v.begin(); cout<<v.size()<<" "<<v.capacity()<<endl;//3

C++ 《STL源码剖析》学习-vector

本文章是笔者学习<STL源码剖析>的学习笔记,记录的是笔者的个人理解,因为个人的水平有限,难免会有理解不当的地方,而且该书出版的时间比较久,难免会有些不一样.如有不当,欢迎指出. vector是c++中经常用到的数据结构,而且在面试时也会有提及,因此了解vector很重要. 一说到vector,我们就很容易想到另外一个与它十分相似的数据结构,关于它们之间显著的差别,我觉得是在于空间运用的灵活性上.数组是静态的,在声明的时候就要指明其具体的空间大小,而vector是动态的,随着元素的增加,它内部

STL源码--vector(一)

一.vector的特性 vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储.设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间.拷贝元素.撤销旧空间,这样性能难以接受.因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些.就是说,vector容器预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每

stl源码分析之vector

上篇简单介绍了gcc4.8提供的几种allocator的实现方法和作用,这是所有stl组件的基础,容器必须通过allocator申请分配内存和释放内存,至于底层是直接分配释放内存还是使用内存池等方法就不是组件需要考虑的事情.这篇文章开始分析gcc4.8 stl的容器源码实现.stl的容器分为序列式容器和关联式容器,前者包括vector,list,queue以及stack等常用数据结构,后者包含了map,set以及hash table等比较高级的结构,本文就从使用最广泛也是最基础的vector开始

STL源码剖析(4):容器(vector)

容器是很多人对STL的第一印象,vector,stack,queue,set,map等等都是容器. 这里先介绍 STL中的序列式容器. 所谓序列式容器,其中的元素可序(ordered),但未必有序(sorted).C++ 本身提供了一个序列式容器--数组(array),STL中还提供了向量(vector),链表(list),堆栈(stack),队列(queue),优先队列(priority queue)等,其中stack和queue只是将deque(双端队列)设限而得到的,技术上可以被归为一种配