分类: C/C++
2008-05-05 12:54:18
标准库vector(容器)类型
#include
using std :: vector ;
vector
vector
vector不是一种数据类型,而只是一个类模板。可用来定义任意多种数据类型。Vector类型的每一种都指定了其保存元素的类型。因此,vector
/*
实际上,class也是定义了一种类型,通过class的对象执行某些方法。而vector就是标准库封装好的特殊的类,通过vector的变量我们可以执行vector的某些方法,来达到操作vector中某一种类型的对象的目的。
*/
几种初始化vector对象的方式
vector
vector
vector
vector
vector
关键概念:vector对象动态增长
vector对象(一级其它标准库容器对象)的重要属性就在于可以在运行时高效地添加元素。因为vector增长的效率高,在元素值已知的情况下,最好是动态地添加元素。
虽然可以对给定元素个数的vector对象预先分配内存,但更有效的方法是先初始化一个空vector对象,然后再动态地增加元素。
/*
至于为什么这样的顺序存储能够做到高效,容以后再续,其中关键一点是,vector的构造函数不止分配了你认为合适的空间,它开出了一些容以后增长用的冗余空间。
*/
值初始化:
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 如果v1与v2相等,则返回true
!=, < , <=, >, >=
v.size() 返回相应vector类定义的size_type的值。
vector的下标操作
可以通过下标访问vector特定位置的元素,但是,只能访问vector中已经存在的元素,即下标不能溢出。
关键概念:安全的泛型编程
for( vector
{
ivec[ix] = 0;
}
C++程序员习惯于优先选用“!=”而不是“<”来编写循环判断条件。调用size()成员函数而不保存它返回的值,在上例中不是必需,但这是良好的编程习惯。在C++中,有些数据结构(如vector)可以动态增长。当增加了新的元素的时候,测试已保存的size值做为循环结束条件就会出问题,因为没有将新加入的元素计算在内。
效率问题:C++ 中有些函数可以声明为内联函数。编译器遇到内联函数时就会直接扩展相应代码,而不是进行实际的函数调用。像size这样的小库函数几乎都定义为内联函数,所以每次循环过程中调用它的运行时代价是比较小的。
下标操作不添加元素
如下的程序是达不到目的的:
vector
for(vector
Ivec[ix] = ix;
试图这样向ivec中添加10个元素是实现不了的,因该用ivec.push_back(ix);
因为必须是已存在的元素才能用下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。
警告:
试图获取不存在的元素必然产生运行时错误。和大多数同类错误一样,不能确保执行过程可以捕捉到这类错误,运行程序的结果是不确定的。由于取不存在的元素的结果标准没有定义,因webutong的编译器实现会导致不同的结果。
这个警告适用于任何使用下标操作的时候。