数组是我们在编程过程中经常使用的对象,而有些数组的大小是不确定的,我们称之为不定长数组(或变长数组).不定长数组的操作给我们带来了众多的不便,例如:
在编程中,我们通常使用new来分配一个存储块来存储数据.下面的语句是分配一个存储100个整数的内存块.
int * nItems=new int[100]
如果我们在程序中为这个数组填充了数据,但又发现填充的整数又不止100个,可以使用下面的语句重新分配存储空间.
delete nItems
int* pnItems=new int[NewSize]
这样操作会导致:丢失原先数组中保存的数据!在C++Builder中,可以使用标准模板库提供的vector类对不定长数组进行操作,并避免上述问题。
标准模板库(STL)是标准C++库中的一部分,它包含了几乎编制所有程序和系统所需要的类属。标准模板库是基于模板的实用类库。在标准模板库中没有图形、组件或其他的什么。这是为了使用户能以更简单多样的方式使用多样的数据。标准模板库提供了可移植的字符串类(String类)、数组(在STL术语中称为矢量)、链表(单向和双向)、对列、映射(象字典一样的东西)和其他标准数据结构的完整体现。
在STL中,变量数组是由vector类来表示的,它允许程序员以顺序或随机的方式访问任意类型的项(每个vector对象只有一种单一类型).下面罗列了vector类中常用的方法:
insert 在数组中添加新的元素
size 返回数组中元素的个数
[] 为数组编写索引,返回数组中某个元素以便读写
=(vector) 数组间的复制
at 与运算符[]相同
begin 返回数组的头部
end 返回数组的尾部
capacity 返回数组已经分配的字节数
reserve 为数组预分配固定的元素数,可以在运行时刻进行修改
empty 判断数组中是否包含元素
erase 从数组中删除某个元素
clear 清楚数组中所有元素
max_size 返回数组所允许的最大尺寸,通常是指系统中用于分配的最大可用内存总数
swap 允许两个数组快速而高效地交换数据
resize 为数组重新确定新的大小,可以使用一个可选参数初始化新值
下面向大家介绍如何利用上述方对不定长数组进行操作:
1、不定长数组的构造
vector <int> newItems1
vector <int,allocator >int> > nItems2
//上述两句代码功能相同,声明一个整数类型的不定长数组,该数组的元素个数为0。
vector <int> nItems3(10,1);//构造一个10个元素的数组,数组的每个元素为1
vector <int> nItems4(nItems3)
vector <int> nItems5(nItems3.begin(),nItems3.end())
//上述两句代码将数组nItems3的内容拷贝到新的不定长数组nItems4和nItems5中
int d1[10]={0,1,2,3,4,5,6,7,8,9}
vector <int> v1(d1,d1+10)
//将数组d1/的所有元素拷贝到不定长数组v1中
2、数组中元素的操作
if(!nItems3.empty())//判断不定长数组nItems3是否包含数据
int first=nItems3[0];//获取数组中的第一个元素
if(nItems4.size()>=2)//判断数组中的元素个数是否大于等于2
nItems4[1]=100;//将数组中的第2个元素赋值
3、元素查找
vector <int> iterator where=find(v1.begin(),v1.end(),35);//在数组中查找35
if(*where!=35)
ShowMessage("数组中没有这个数"
4、元素的添加和删除
nItems1.insert(nItems1.begin(),10);//在数组的头部插入一个元素10
nItems1.insert(nItems1.end(),20);//在数组的尾部插入一个元素20
vector <int>::iterator where=find(v1.begin(),v1.end(),4)
if(*where==4)
v1.insert(where,8)
nItems4.insert(nItems4.end(),v1.begin(),v1.end());//将数组v1的全部元素插入到数组nItems4的尾部
nItem3.erase(nItems3.begin());//删除数组的第一个元素
nItem3.erase(nItems3.end());//删除数组的最后一个元素
nItem3.erase(nItems3.begin(),nItems3.end());//删除数组的所有元素,相当于nItems3.clear()
vector <int>::iterator where=find(v1.begin(),v1.end(),4)
if(*where==4)
v1.erase(where)
//在数组中寻找元素4,找到则删除它
注意:一定要在程序中加入#include<vector.h>这一句代码。
由此可见,vector类中的众多方法解决了不定长数组中元素的插入删除等工作,我们不需要编程实现上述操作带来的元素移动等问题。是不是很简便啊?