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

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

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

vector源码3(参考STL源码--侯捷):pop_back、erase、clear、insert

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;

}

};


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

  1. vector源码3(参考STL源码--侯捷):pop_back、erase、clear、insert

    vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷):空间分配.push_back vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 v ...

  2. vector源码2(参考STL源码--侯捷):空间分配、push_back

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

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

    list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...

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

    list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...

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

    list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...

  6. list源码3(参考STL源码--侯捷):push_front、push_back、erase、pop_front、pop_back、clear、remove、unique

    list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...

  7. STL 源码分析 (SGI版本, 侯捷著)

    前言 源码之前,了无秘密 algorithm的重要性 效率的重要性 采用Cygnus C++ 2.91 for windows cygwin-b20.1-full2.exe 下载地址:http://d ...

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

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

  9. 侯捷STL课程及源码剖析学习2: allocator

    以STL 的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作默默付出. 一.分配器测试 测试代码 #include < ...

随机推荐

  1. 第15章:MongoDB-聚合操作--聚合管道--$match

    ①$match 用于对文档集合进行筛选,里面可以使用所有常规的查询操作符. 通常会放置在管道最前面的位置,理由如下: 1:快速将不需要的文档过滤,减少后续操作的数据量 2:在投影和分组之前做筛选,查询 ...

  2. MySQL 安装与使用(一)

    操作系统:CentOS release 5.10 (Final) 文件准备: MySQL-server-community-5.1.73-1.rhel5.i386.rpm MySQL-client-c ...

  3. CentOS7安装BugFree

    1. 安装apache yum install httpd 2. 安装mysql yum install mysql yum install mysql-server 注意: 1)已安装mysql的跳 ...

  4. Dnsmasq安装与配置-搭建本地DNS服务器

    默认的情况下,我们平时上网用的本地DNS服务器都是使用电信或者联通的,但是这样也导致了不少的问题,首当其冲的就是上网时经常莫名地弹出广告,或者莫名的流量被消耗掉导致网速变慢.其次是部分网站域名不能正常 ...

  5. Spring Boot 2 启动时加载properties文件

    每个项目从开发到测试再到上线所需要的各种环境是不同的,这就需要维护相应的配置文件,比如properties或yml文件.有了配置文件后就要考虑如何与应用进行集成. 对于云环境来讲,项目发布需要打成镜像 ...

  6. SQL SERVER 索引视图

    创建: CREATE VIEW [dbo].[view_xxx] WITH SCHEMABINDING AS SELECT Table1.主键, Table1.外键 FROM Table1, Tabl ...

  7. [C#]Dapper学习笔记

    1.安装,直接用nuget搜索Dapper就行,不过只支持框架4.5.1 2.数据库测试表 CREATE TABLE [dbo].[Student]( [ID] [bigint] NULL, ) NU ...

  8. 【SPOJ10707】 COT2 Count on a tree II

    SPOJ10707 COT2 Count on a tree II Solution 我会强制在线版本! Solution戳这里 代码实现 #include<stdio.h> #inclu ...

  9. “全栈2019”Java多线程第三十六章:如何设置线程的等待截止时间

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 下一章 "全栈2019"J ...

  10. mysql多列索引

    1,数据库每次查询只能使用一个索引 2,假设数据 表T (a,b,c) rowid 为物理位置rowid a b c(1) 1 1 1(2) 2 1 13(3) 2 2 14(4) 1 3 3(5)  ...