STL 源码学习笔记——vector

原创 2015年07月09日 10:33:02

Vector结构定义

vector所采用的数据结构非常简单:线性连续空间。它以两个迭代器start和finish分 别 指 向 配 置 得 来 的 连 续 空 间中 目 前 已 被 使 用 的 范 围 , 并 以 迭 代 器end_of_storage指向整块连续空间(含备用空间)的尾端:

template <class T, classAlloc = alloc> 
class vector{ 
... 
protected: 
iterator  start; //表示目前使用空间的头
iterator  finish; //表示目前使用空间的尾
iterator  end_of_storage;//表示目前可用空间的尾
... 
}; 

Vector方法实现

为了降低空间配置时的速度成本,vector实际配置的大小可能比客端需求量更大一些,以备将来可能的扩充。这便是容量(capacity)的观念。换句话说一个 vector 的容量永远大于或等于其大小。一旦容量等于大小,便是满载,下次再有新增元素,整个vector就得另觅居所。
运用start, finish, end_of_storage三个迭代器,便可轻易提供首尾标示、
大小、容量、空容器判断、注标([ ])运算子、最前端元素值、最后端元素值等机能:

template <class T, classAlloc = alloc> 
class vector{ 
... 
public:
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); } 
iterator  begin() { return start; } 
iterator  end() { return finish; } 
size_typesize() const { return size_type(end() - begin()); } 
size_typecapacity() const { 
return size_type(end_of_storage - begin()); } 
bool empty() const { return begin() == end(); } 
referenceoperator[](size_type n) { return*(begin() + n); } 
referencefront() { return *begin(); } 
referenceback() { return *(end() - 1); } 
... 
}; 

这里写图片描述

由上可知,一个vector真实空间大小为capacity(),而真实的元素个数为size()。当capacity < size时,vector需要进行扩容。将会经历三个步骤:
1. 调用alloc,分配一个capacity*2的新空间;
2. 将旧的vector上的元素copy到新vector中;
3. 释放原来的vector空间。

vector 的元素操作push_back, pop_back, erase, clear, insert

vector 容器的push_back,pop_back都是操作finish指向的元素,也就是最后一个成员。有点类似于栈的操作形式。

void push_back(const T& x) { 
if (finish != end_of_storage) { //还有备用空间
construct(finish, x); 
++finish; 
} 
else 
//全域函式,见 2.2.3节。
//调整水位高度
//已无备用空间
}

void pop_back() { 
--finish; 
destroy(finish); 
} 

erase(first, last)将会把first到last之间的所有元素删除,并且合并剩余的部分,如下图:

这里写图片描述

insert(position,n,x)
这里写图片描述

这里写图片描述

这里写图片描述

《STL源码剖析》学习笔记

第二章:空间配置器(allocator) 考虑到小型区块可能造成的内存破碎问题,SGI设计了双层级配置器。 当配置区块超过128bytes时,便调用第一级配置器,即直接使用malloc() free(...
  • qiaominghe
  • qiaominghe
  • 2016年05月27日 09:05
  • 1527

《STL源码剖析》---stl_vector.h阅读笔记

在STL中,最常用的就是容器,最常用的容器就是vector了。想要了解vector如何动态增长等特性,看一下stl中vector的代码吧!...
  • KangRoger
  • KangRoger
  • 2014年08月12日 16:16
  • 2919

STL<vector>用法汇总

使用场合: vector算是一个比较万金油的容器,它是一个可变大小数组,支持随机访问,不过在尾部以外的位置进行增加和删除操作会比较耗时。通常用vector来代替原始的数组来使用,比较方便。 ...
  • weixin_35929051
  • weixin_35929051
  • 2016年09月25日 13:16
  • 970

《STL源码剖析》学习之迭代器

在设计模式中有一种模式叫迭代器模式,简单来说就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素,这种设计思维在STL中得到了广泛的应用,是STL的关键所在,通...
  • shudou
  • shudou
  • 2013年09月08日 22:54
  • 5829

vector容器内部实现机理(源代码和测试代码)

//Vector.h,个人实现的头文件,源文件引用时用#include "Vector" #ifndef VECTOR_INCLUDED #define VECTOR_INCLUDED templat...
  • u013021513
  • u013021513
  • 2014年12月16日 15:07
  • 534

STL vector用法介绍+ STL 常用函数用法

介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作。本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用。...
  • hhu1506010220
  • hhu1506010220
  • 2016年07月20日 20:23
  • 717

STL源码学习总结及项目下载地址

从开始看STL源码到今天差不多有一个月的时间了,在这研读STL源码过程中确实学习到了很多,深深被大师们的设计思想所打动。其中使用迭代器的思想是其STL的最大的亮点,通过泛型编程,是得所有的容器对外都提...
  • a_1_2_ab
  • a_1_2_ab
  • 2014年04月29日 09:45
  • 1107

【C++】std::vector源码浅析

std::vector是stl标准模板库中的一个序列容器,其源码实现有几个特点:(1)C++中include的标准头文件是没有“.h”后缀的,其实这是C++的一层包裹,内部实现还是在“.h”文件中完成...
  • iEearth
  • iEearth
  • 2015年12月03日 15:30
  • 1972

STL vector中的clear方法(18)

原文地址:http://www.cplusplus.com/reference/vector/vector/clear/ public member function std::v...
  • guang_jing
  • guang_jing
  • 2014年08月15日 12:50
  • 1311

STL源码剖析学习笔记(一)

本文主要是对侯捷《STL源码剖析》学习的知识点总结,以及自己搜集到的资料以及理解,若有任何建议以及意见请联系本人 那么,准备迎接吧...
  • es_tech
  • es_tech
  • 2017年01月08日 23:17
  • 169
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL 源码学习笔记——vector
举报原因:
原因补充:

(最多只允许输入30个字)