STL中最简单也是最有用的容器之一是vector<T>类模板,称为向量容器,是序列类型容器中的一种。

1.vector<T> 对象的基本用法
(1)声明:
vector<type>  v;    //容量为0构造v对象,指定元素类型为type
vector<type>  v(n);    //元素为n构造v对象,指定元素类型为type,
vector<type>  v(n, initValue);    //元素为n构造v对象,指定元素类型为type,且所有元素被初始化为initValue;

    vector<int> avec();
cout << avec.size() << endl;
cout << avec.capacity() << endl; avec.reserve();
cout << avec.size() << endl;
cout << avec.capacity() << endl;

  

(2)成员函数
v.capacity();    //返回v在其扩大前能够存储元素个数
v.size();    //返回v当前包含的元素(值)的个数,即v的长度
v.empty();    //当且仅当v不包含任何元素(值)是返回true,即判空函数
v.reserve(n);    //增长v,使其容量为n,并且不影响v的长度(实际存储的值得个数)
v.push_back(value);    //讲value的值添加在v的尾部,并将v的长度+1
v.pop_back();    //翻出v的最后一个元素,并将v的长度-1
v.front();    //返回v的第一个元素的引用
v.back();    //返回v的最后一个元素的引用

v.max_size();返回当前系统中能够支持创建最大的元素数量,实际取决于当前机器的内存限制。

v的长度就是Vector对象中的所有数据项的个数,即v.size();
v的容量就是Vector对象中的能够存储元素的个数,即v.capacity();

(3)Vector对象的下标操作
v[i];    //访问下表为i的v中的元素
v1 = v2;    //将v2的一个副本赋值给v1
v1 == v2;    //当且仅当v1和v2在相同位置上有相同给的值时,返回true,即一个元素一个元素的比较
v1 < v2;    //当且仅当v1在字典排序上小于v2时,返回true

v可以使用下标和下表操作运算符访问;
v的第一个元素的下表是:0;
v的最后一个元素的下表是:v.size() - 1;
Vector对象的下表雷系与string对象和C风格的数组下表操作,但是还有一个重要的差别,就是不能直接对Vector对象进行有增量的下表运算,且v的容量没有指定,或者少于下表的值,不能通过下表运算更新Vector对象的容量,此种情况必须使用v.push_back(Value)来处理。

(4)包含迭代器vector<T>成员函数
    STL容器基本上都支持一种迭代器的访问方法。本质上讲,“迭代”是一种特殊类型的对象,它能够通过该存储元素地址“指向”容器中的元素,如Vector<T>类容器,并能够访问存储在该位置的值以及能够从一个元素移动到另一个元素。每一个STL容器都提供一组自己的迭代器类型和(至少)两个返回迭代器的方法:*begin():返回一个定位在容器第一个元素的迭代器;*end():返回一个定位在容器最后一个元素后面且紧挨着该元素的迭代器,这两个成员函数实际上指出容器中数据的一个“半开区域”,有两个好处(1)使用迭代器的值等于end来表示迭代结束,(2)方便使用begin == end 来判断容器是否为空。

vector<T>对象的迭代器成员函数
v.begin();    //如上
v.end();    //如上
v.rbegin();    //返回一个定位在v的最后一个值得后的反向迭代器
v.rend();    //返回一个定位在v的第一个值前面、紧挨着改制的迭代器
v.insert(pos, value);    //讲value插入在v的迭代器位置pos处
v.insert(pos, n, value);    //讲value的n个副本值插入在v的迭代器位置pos处
v.erase(pos);    //删除v中迭代器位置pos处的值,v的长度-1,v的容量不变
v.erase(pos1, pos2);    //删除v中从迭代器位置pos1到pos2之间的值

迭代器的初始化:vector<T> :: iterator it = 初始值;
迭代器的三个重要操作:
# it++;    //将it向前移动到“向量”的下一个元素上
# it--;    //将it向后移动到“向量”的前一个元素上
# *it;    //访问迭代器it所指的元素的值

2. vector<T>多维对象
(1)二维对象
   一步法定义:
    typedef vector<double> TableRow;
    typedef vector<TableRow> Table;
    Table tableaa(ROWS, TableRow(COLUMNS, 0.0));//定义非空的二维Table
    Table tablebb;        //定义为空的二维Table对象

二步法定义:
    vector <double> RowVector(COLUMNS, 0.0);
    vector <vector <double> > Table(ROWS, RowVector);
(2)增加一行
     table.push_back(TableRow(COLUMNS, 0.0));
    增加一列即,在每一行的末尾追加一个值;
     for(int i = 0; i < table.size(); i++)
    {
        table.[i].push_back(0.0);
     }
(3)如果二维vector每一行都是相同元素个数,则table是表格的形式,每一行的vector.size()就是table二维数据的列数

(4)二维矩阵
typedef vector<double> MatrixRow;
typedef vector<MatrixRow> Matrix

几个需要理解清楚的方法:

(1)reserve: 只改变capacity,不改变size,只是容器预留空间,但在空间内不真正创建元素对象,所以不能引用容器内的元素。

(2)resize : 改变size,也影响capacity,且在容器中创建对象,因此,调用后就可以引用容器内的对象,后续再调用push_back(),则在resize()空间的后面直接追加。 

(3)swap: ,当与初始对象交换是,快速将一个vector容量变为0,且size变为0

(4)clear, 清空容器元素,size=0,但是capacity不变。

  resize,后语新增加的元素,初始化值,对于原有元素,值不影响。

int _tmain(int argc, _TCHAR* argv[])
{ vector<int> jvector(, );
cout << "初始化" << endl;
cout << jvector.size() << endl;
cout << jvector.capacity() << endl;
jvector.reserve();
cout << "reserve" << endl;
cout << jvector.size() << endl;
cout << jvector.capacity() << endl;
jvector.resize();
cout << "resize" << endl;
cout << jvector.size() << endl;
cout << jvector.capacity() << endl;
vector<int> btemp;
jvector.swap(btemp);
cout << "swap" << endl;
cout << jvector.size() << endl;
cout << jvector.capacity() << endl; system("pause");
return ;
}

STL容器之一vector的更多相关文章

  1. STL 容器(vector 和 list )

    1.这个容器的知识点比较杂 迭代器的理解: 1.erase()函数的返回值,它的迭代器在循环遍历中的奇特之处: #define _CRT_SECURE_NO_WARNINGS #include < ...

  2. STL—— 容器(vector)元素的删除

    1. clear() 将整个 vector 都删除 使用 vectorname.clear() 可以将整个vector 中的元素全部删除,但是内存不会释放,如下代码: 1 #include <i ...

  3. STL—— 容器(vector)数据插入insert()方法 的返回值

    vector 容器下的 insert() 方法拥有返回值,由于insert() 方法拥有4种重载函数,他的返回值不尽相同. 第一种,插入单个元素后的返回值: 1 #include <iostre ...

  4. STL—— 容器(vector)的数据插入之 insert()

    vector 容器可以使用 vectorName.insert() 方法插入元素,vectorName.insert() 函数一共有4种重载方法: 第一种 insert() 用法:在指定地址插入单个元 ...

  5. STL—— 容器(vector)的各种功能方法

    1. 获取容器的元素个数 size() 使用 vectorName.size() 可以输出这个容器中类型的个数,如下代码: 1 #include <iostream> 2 #include ...

  6. STL—— 容器(vector)的数据写入、修改和删除

    1. 通过 push_back() 尾部增加一个元素 : vector 可以通过 "push_back " 写入数据,通过 push_back 可以将数据直接写入至 vector ...

  7. STL—— 容器(vector)的内存分配,声明时的普通构造&带参构造

    vector 的几种带参构造 & 初始化与内存分配: 1. 普通的带参构造: vector 的相关对象可以在声明时通过 vector 的带参构造函数进行内存分配,如下: 1 #include ...

  8. STL容器分析--vector

    vector是一种动态数组,是基本数组的类模板. vector,支持随机访问.在数据结构上,属于顺序线性表. 而且,由于是动态数组,

  9. STL—— 容器(vector)begin() 与 rbegin() , end() 与 rend()

    1. Vector 迭代器首地址与尾地址 begin() 和 end() 在代码中可以将迭代器用作参数的位置可以使用  begin() 和 end() 获取地址,如下代码: 1 #include &l ...

随机推荐

  1. Linux CentOS 7 & JDK 1.7 安装与配置

    前言 简单记录一下在CentOS 7中安装配置JDK 1.7的全过程~ 下载 首先是jdk 1.7 64bit & 32bit的下载地址: jdk-7u79-linux-x64.tar.gz ...

  2. Android.InstallDevelopmentEvn

    1. 如何搭建Android Application的开发环境 http://blog.csdn.net/yzhj2005/article/details/6980676 2. 在Mac OS X系统 ...

  3. 开发中,android手机WIFI无法使用,无SIM卡故障解决

    用eclipse 开发android中,突然出现,android手机WIFI无法使用,无SIM卡故障解决 发现故障后,想办法刷机(没有成功),触点清洁都搞了. 最后恢复出厂设置居然解决了,留资料给同行 ...

  4. [Jmeter] 用xsltproc生成html格式的报告

    1.下载xsltproc 下载地址:ftp://ftp.zlatkovic.com/libxml/libxslt-1.1.26.win32.zip 其中包含我们所需要的xsltproc可执行文件:xs ...

  5. js,jquery的数字型字符串变量比较大小

    转:http://blog.csdn.net/dxnn520/article/details/8267173 var定义的变量应该是字符串,有时没有经过类型转换而进行比较的话,小于十的话还可以,如果大 ...

  6. SSRF-php初探

    0x00 前言 1)    SSRF的概念很好理解,请自行百度. 2)    JAVA/PHP/PYTHON都存在SSRF漏洞(至于其他语言的情况,了解粗浅尚不得知). 3)    SSRF的利用方式 ...

  7. oracle 视图带参数

    -- create or replace package p_view_param is --参数一 function set_ID(num number) return number; functi ...

  8. 基于centos6.5 hadoop 集群搭建

    1.修改Linux主机名2.修改IP3.修改主机名和IP的映射关系 ######注意######如果你们公司是租用的服务器或是使用的云主机(如华为用主机.阿里云主机等) /etc/hosts里面要配置 ...

  9. java链表实现

    import java.util.Scanner; class DATA2 { String key; // 结点的关键字 String name; int age; } class CLType / ...

  10. Linux学习笔记:Shell脚本学习

    概念 真正能够控制计算机硬件(CPU.内存.显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁. 由于安全.复杂.繁琐等原因,用户不能直接接触内核(也没有 ...