C++Primer——标准库vector(容器)类型

转自:http://blog.chinaunix.net/u2/68268/showart_673545.html

C++Primer——标准库vector(容器)类型1

 

标准库vector(容器)类型

#include <vector>

using std :: vector ;

vector<int> ivec;

vector<myclass>  myvec;

vector不是一种数据类型,而只是一个类模板。可用来定义任意多种数据类型。Vector类型的每一种都指定了其保存元素的类型。因此,vector<int>vector<myclass>都是数据类型,vector<int>类型是含有若干int类型对象的vector,变量名为ivec

/*

实际上,class也是定义了一种类型,通过class的对象执行某些方法。而vector就是标准库封装好的特殊的类,通过vector的变量我们可以执行vector的某些方法,来达到操作vector中某一种类型的对象的目的。

*/

 

几种初始化vector对象的方式

vector<T>      v1;                 vector保存类型为T的对象,默认构造函数v1为空;

vector<T>      v2(v1);           v2v1的一个副本;

vector<T>      v3(n, i);          v3包含n个值为i的元素;

vector<T>      v4(n);            v4含有值初始化的元素的n个副本。

 

vector<T>      v2(v1);当把一个vector对象复制到另一个vector对象时,新复制的vector中每一个元素都初始化为原vector中相应元素的副本。而且两个vector对象必须保存同一种元素类型。

关键概念:vector对象动态增长

vector对象(一级其它标准库容器对象)的重要属性就在于可以在运行时高效地添加元素。因为vector增长的效率高,在元素值已知的情况下,最好是动态地添加元素。

虽然可以对给定元素个数的vector对象预先分配内存,但更有效的方法是先初始化一个空vector对象,然后再动态地增加元素。

/*

至于为什么这样的顺序存储能够做到高效,容以后再续,其中关键一点是,vector的构造函数不止分配了你认为合适的空间,它开出了一些容以后增长用的冗余空间。

*/

 

值初始化:

vector<T>      v4(n);     如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化。这个由库生成的初始值将用来初始化容器中的每个元素,具体为何,取决于vector中元素的数据类型。

如果vector中保存内置数据类型(如int)的元素,那么元素初始化值为0

如果vector中保存类类型的元素,那么标准库将用类的默认构造函数创建元素的初始化式。

如果某些类没有默认构造函数而有其他构造函数,初始化时就必须提供元素的初始化值。

如果类类型没有任何构造函数,那么标准库仍对这个对象的每个成员都进行值初始化。

 

vector对象的操作:

v.empty()                            如果v为空,则返回true,否则返回false

v.size()                         返回v中元素的个数

v.push_back( t )            v的末尾增加一个值为t的元素                  

v[n]                            返回v中位置为n的元素

v1 = v2                        v1的元素替换成v2种元素的副本

v1 == v2                      如果v1v2相等,则返回true

!=, < , <=, >, >=   

 

v.size()    返回相应vector类定义的size_type的值。

 

vector的下标操作

可以通过下标访问vector特定位置的元素,但是,只能访问vector中已经存在的元素,即下标不能溢出。

关键概念:安全的泛型编程

for( vector<int> :: size_type ix = 0; ix != ivec.size(); ++ix )

{

       ivec[ix] = 0;

}    

C++程序员习惯于优先选用“!=”而不是“<”来编写循环判断条件。调用size()成员函数而不保存它返回的值,在上例中不是必需,但这是良好的编程习惯。在C++中,有些数据结构(如vector)可以动态增长。当增加了新的元素的时候,测试已保存的size值做为循环结束条件就会出问题,因为没有将新加入的元素计算在内。

效率问题:C++ 中有些函数可以声明为内联函数。编译器遇到内联函数时就会直接扩展相应代码,而不是进行实际的函数调用。像size这样的小库函数几乎都定义为内联函数,所以每次循环过程中调用它的运行时代价是比较小的。

 

下标操作不添加元素

如下的程序是达不到目的的:

vector<int>     ivec;

for(vector<int> :: size_type  ix = 0;  ix != 10; ix++ )

       Ivec[ix] = ix;

试图这样向ivec中添加10个元素是实现不了的,因该用ivec.push_back(ix);

因为必须是已存在的元素才能用下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。

警告:

试图获取不存在的元素必然产生运行时错误。和大多数同类错误一样,不能确保执行过程可以捕捉到这类错误,运行程序的结果是不确定的。由于取不存在的元素的结果标准没有定义,因webutong的编译器实现会导致不同的结果。

这个警告适用于任何使用下标操作的时候。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值