第一节:vector简介
vector是一种典型的类模板,使用的时候必须进行实例化。
vector的数据存储在数组上,支持随机访问迭代器,支持下标操作[]和at操作,支持手动扩容和自动容量增长。
vector是STL中的最常用容器,并支持STL的通用算法。
第二节:vector的迭代器介绍
vector支持iterator、const_iterator、reverse_iterator、const_reverse_iterator,前两个是正向迭代器,后两个是逆向迭代器。
迭代器支持操作:*操作符、->操作符、前后++、前后--、+=、+、-、==、!=、[]、<、>、<=、>=
第三节:需重新定向iterator的场景
1.vector内存重分配
vector支持容量自动增长,扩展容量(自动增长或手动操作增长容量)的时候会申请一块更大的内存并将现有数据拷贝过去,此时所有的迭代器都会失效,需重新指向。测试insert导致容量自动增长时,已有的迭代器全部失效。vector的容量自动增长方式经测试并不是翻倍增长模式。
2.vector交换
swap以后迭代器仍指向交换前的元素储存位置,等于失效,需重新指向。
3.vector删除元素
erase以后vector上的所有迭代器都失效,需重新指向。
第四节:vector使用小贴士
vector的下标操作[]和at仅用来对已经插入的元素进行取值和赋值,不能用来insert。
vector默认容量较小,可以通过指定较大初始容量的方式避免vector多次自动增长带来的性能损耗,可以指定容量的操作有:构造和复制构造、reserve、resize、assign。
vector<typename>可以用iterator和const_iterator迭代器,而const vector<typename>只能使用const_iterator。
第五节:让vector更高效
vector支持的泛型算法,即STL算法,鄙人比较菜,STL的算法还没懂,下次更新吧。
第六节:vector常用方法
构造函数:
根据分配器构造、构造指定容量的vector、构造含有count个val的vector、
复制构造函数:
根据已有的vector构造,要求类型一致。
重载操作符:
操作符= 进行赋值
push_back:尾插法插入元素,如果当前容量不足,就多申请一个空间。
insert:
有三个重载版本,插入单个元素至指定的迭代器后面、插入count个val到iter后、将两个迭代器之间的元素插入指定的iter后。
reserve:
扩展指定的容量。
capacity:
返回vector的总容量,还有一些标准库未要求,vs2010实际支持的扩展。
begin、end、rbegin、rend、cbegin、cend、crbegin、crend
resize:
可以减少容量,也可以增加容量。有多种重载版本。
size:
已经容纳元素的数量。
empty:
已容纳元素数量是否为0.
at  & []:
操作类似string的操作,以0作为第一个元素的位置,返回装载的元素。
data:
返回指向第一个元素的指针。
front:
抛出第一个元素。
back:
抛出vector最后一个元素。
pop_back:
删除最后一个元素。
assign:
分配容量,具有数个重载版本:分配N个val元素的vector。
erase:
删除当前迭代器指向的元素,并返回指向下一个元素的迭代器、删除迭代器区间的元素并返回指向下一个元素的迭代器。
clear:
清理vector中的元素,并将size设置为0,不影响容量,据称对容纳元素的析构是在vector被析构时进行。
swap:
交换vector中的所有元素。
第七节:vs2010自带vector头文件学习
头文件编译的一些技巧,其他的实现就不骗点击量了。
// vector standard header
//避免重复编译的方式,和#ifndef/#define/#endif一样的作用
#pragma once
#ifndef _VECTOR_
#define _VECTOR_
#ifndef RC_INVOKED
#include <xmemory>
#include <stdexcept>
//字节对齐方式,按照_CRT_PACKING指定的字节进行对齐,把原来的对齐方式压栈,并设置新的对齐方式为_CRT_PACKING
  #pragma pack(push,_CRT_PACKING)
//指定告警级别为3
  #pragma warning(push,3)
//编译器的一个技巧,#pragma push_macro("new") #undef new #pragma pop_macro("new"),这三个联合起来就是定义一个宏new并压入栈,取消new的定义,将压入栈的new弹出栈,这样做的目的是为了恢复new的本来含义,当包含的头文件中已经包含了宏new的定义时,这样做可以取消宏new的定义,而使用new的本来含义。在文件定义完毕后取消压入栈的宏new。
  #pragma push_macro("new")
  #undef new
//让编译器忽视4127和4244号告警
#pragma warning(disable: 4127)
#pragma warning(disable: 4244)
//将vector包含在命名空间std中,见宏定义可以很好理解:_STD_BEGIN和_STD_END两个宏完成namespace //std包含
//#define _STD_BEGIN namespace std {  
//#define _STD_END }    
//#define _STD ::std::
_STD_BEGIN
#define _VECTOR_ORPHAN_RANGE (_ITERATOR_DEBUG_LEVEL == 2)
// TEMPLATE CLASS _Vector_const_iterator
template<class _Myvec>
class _Vector_const_iterator
: public _Iterator012<random_access_iterator_tag,
//typename表示这是一个嵌套从属名称,而非类的静态成员变量
typename _Myvec::value_type,
typename _Myvec::difference_type,
typename _Myvec::const_pointer,
typename _Myvec::const_reference,
_Iterator_base>
{ // iterator for nonmutable vector

第八章:写在事后

花了一天时间把vector的源码定义看了一遍,以为有所了解,等到写文章的时候和前辈一对比,才发现只是懂概念,根本谈不上巧妙应用,我有病曰浮夸,凡事了了而为,愿改之,坚持学习实践,我可是要成为海贼王的男人。

【STL源码学习】细品vector的更多相关文章

  1. stl源码学习(版本2.91)--list

    stl源码学习(版本2.91)--list 一,阅读list()构造函数的收获 1,默认构造函数的作用和被调用的时机 struct no{ no(int i){} //no(){ // std::co ...

  2. 【STL源码学习】STL算法学习之二

    第一章:前言 学习笔记,记录学习STL算法的一些个人所得,在以后想用的时候可以快速拾起. 第二章:明细 copy 函数原型: template <class InputIterator, cla ...

  3. 【STL源码学习】std::list类的类型别名分析

    有了点模板元编程的traits基础,看STL源码清晰多了,以前看源码的时候总被各种各样的typedef给折腾得看不下去, 将<list>头文件的类继承结构简化如下 #include < ...

  4. JDK源码学习笔记——ArrayList/Vector

    一.类定义 public class ArrayList<E> extends AbstractList<E> implements List<E>, Random ...

  5. 【STL源码学习】STL算法学习之一

    第一章:引子 STL包含的算法头文件有三个:<algorithm><numeric><functional>,其中最大最常用的是<algorithm>, ...

  6. STL源码学习----lower_bound和upper_bound算法

    转自:http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html 先贴一下自己的二分代码: #include <cstdio&g ...

  7. STL源码学习----lower_bound和upper_bound算法[转]

    STL中的每个算法都非常精妙,接下来的几天我想集中学习一下STL中的算法. ForwardIter lower_bound(ForwardIter first, ForwardIter last,co ...

  8. 【STL源码学习】STL算法学习之三

    第一章:前言 数量不多,用到的时候会很爽. 第二章:明细 STL算法中的又一个分类:分割:将已有元素按照既定规则分割成两部分.  is_partitioned 函数原型: template <c ...

  9. 【STL源码学习】STL算法学习之四

    排序算法是STL算法中相当常用的一个类别,包括部分排序和全部排序算法,依据效率和应用场景进行选择. 明细: sort 函数原型: template <class RandomAccessIter ...

随机推荐

  1. 优化Hoax or what的思考

    在抽取MinHeap的时候,涉及到重载,覆盖,虚函数等,有几点之前没注意到的问题在这里总结下: 1. 覆盖(override)只要是函数同名就会被覆盖,子类指针若调用父类的同名不同参数的函数的话,会在 ...

  2. 重载操作符 operator overloading 学习笔记

    重载操作符,只是另外一种调用函数的方法和表现方式,在某些情况它可以让代码更简单易读.注意不要过度使用重载操作符,除非它让你的类更简单,让你的代码更易读. 1语法 如下: 其中友元,关键字不是必须的,但 ...

  3. hdu 3033 I love sneakers!

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. ZEat

    借助微博平台,记录每日饮食情况的Andorid程序. 项目地址:https://github.com/atskyline/ZEat 1.0.0APK下载地址:https://github.com/at ...

  5. 【转】Android之NDK开发

    原文网址:http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html 一.NDK产生的背景 Android平台从诞生起,就已经支 ...

  6. Uva 10480 Sabotage 最大流

    表示自从学了网络流,就基本上是一直用dinic 这个题一看就是用最大流,作为常识,两个点之间的最大流等于最小割 但是这个题需要输出割边,然后我就不会了,dinic判流量我觉得也可做,但是一直wa 然后 ...

  7. IGT一道笔试题

    1到n连续的n个数 输入m 得出m个有序序列 比如 输入为n=5 ,m=3 则输出 543 542 541 532 531 521  432 431 421 321 当前长度为i,每个位上的取之范围为 ...

  8. oracle触发器学习

    转自:http://blog.csdn.net/indexman/article/details/8023740/ 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触 ...

  9. 2016"百度之星" - 复赛(Astar Round3) 1003 拍照

    拍照 思路:先静态,离线树状数组,分别统计每个点向左向右能看到的船的数量.再枚举整个区间求最大值. 应为人和船都是动态的,假设船往左走,处理每个点看到向左最大船的数量,满足动态条件.就是向左的船一开始 ...

  10. Android 网络权限配置

    Android开发应用程序时,如果应用程序需要访问网络权限,需要在 AndroidManifest.xml 中加入以下代码 <uses-permission android:name=”andr ...