C++学习笔记之八 复合类型---数组的替代品vector和array

本节介绍一下数组的替代品---模板类vector和arrey。

1、模板类vector

模板类vector类似与string类,也是一种动态数组。您可以在运行阶段设置vector对象的长度,可在末尾附加新数据,还可以在中间插入新数据。基本上,它是使用new创建动态数组的替代品。实际上vector类确实使用new和delete来管理内存,但这种工作是自动完成的。

vector的使用方法:

首先,要使用vector对象,必须包含头文件vector。

其次,vector包含在名称空间std中,因此您可使用using编译指令、using声明或std::vector。

第三,模版使用不同的语法来指出它存储的数据类型。

第四,vector类使用不同的语法来指定元素数。

示例:

#include <vector>

. . .

using  namespace  std;

vector<int>  vi;           //创建一个0大小的int数组

int  n;

cin  >>  n;

vector<double>  vd(n);              //创建一个n个元素的double数组

其中,vi是一个vector<int>对象,  vd是一个vector<double>对象。由于vector对象在您插入或添加值时自动调整长度,因此可以将vi的初始长度设置为零。但要调整长度,需要使用vector包中的各种方法。

一般而言,下面的声明创建一个名为vt的vector对象,它可以存储n_elem个类型为typeName的元素:

vector<typeName>  vt(n_elem); ,其中,参数n_elem可以是整形常量,也可以是整型变量。

2、模板类array (C++11)

vector类的功能比数组强大,而且使用的是自由存储空间,但是付出的代价是效率稍低。如果您需要的是长度固定的数组,使用数组是更佳的选择,但代价是不那么方便和安全。有鉴于此,C++11新增了模板类array,它也位于名称空间std中。与数组一样,array对象的长度也是固定的,也使用栈(静态内存分配),而不是自由存储区,因此其效率与数组相同,但更方便更安全。
使用方法:
首先要创建array对象,需要包含头文件array.创建语法如下:
#include  <array>
.  .  .
using  namespace  std;
array<int ,  5>  ai;        //创建一个5个int元素的数组
array<double,  4> ad  =  { 1.2,  2.1,  3.43,  4.3};
推而广之,下面的声明创建一个名为arr的array对象,它包含n_elem个类型为typename的元素:
array<typename,  n_elem>  arr;
需要注意的是,与创建vector对象不同的是,n_elem不能是变量

3、比较数组、vector对象和array对象

从一个程序开始:
#include  <iostream>
#include  <vector>
#include  <array>
int  main()
{
using namespace  std;
double a1[4] = {1.2,  2.4,  3.6,  4.8};
vector<double>  a2(4);         //创建一个4个元素的vector数组

a2[0]  =  1.0/3.0;
a2[1]  =  1.0/5.0;
a2[2]  =  1.0/7.0;
a2[3]  =  1.0/9.0;
array<double, 4> a3 = {3.14, 2.72, 1.62, 1.41};
array<double, 4> a4;
a4 =a3;
cout<< "a1[2] : "<< a1[2] << " at "<< &a1[2] << endl;
cout<< "a2[2] : "<< a2[2] << " at "<< &a2[2] << endl;
cout<< "a3[2] : "<< a3[2] << " at "<< &a3[2] << endl;
cout<< "a4[2] : "<< a4[2] << " at "<< &a4[2] << endl;

a1[-2]  =  20.2;
cout << "  a1[-2]:  " << a1[-2]  << "  at  "  << &a1[-2]  <<endl;
cout << "  a3[2]:  " << a3[2]  << "  at  "  << &a3[2]  <<endl;
cout << "  a4[2]:  " << a4[2]  << "  at  "  << &a4[2]  <<endl;
return  0;

}
输出结果:
a1[2]: 3.6 at  0x28cce8
a2[2]: 0.142857  at  0xca0328
a3[2]: 1.62  at  0x28ccc8
a4[2]: 1.62  at  0x28cca8
a1[-2]: 20.2  at  0x28ccc8
a3[2]:  20.2  at  0x28ccc8
a4[2]:  1.62  at  0x28cca8
需要注意的地方:
(1)一个array对象可以赋给另一个array对象,而数组,必须逐个元素复制数据。
(2)注意这个语句:a1[-2] = 20.2;
其含义是:找到a1指向的地方,向前移两个double元素,并将20.2存储到目的地。也就是说,将信息存储在数组的外面。与C语言一样,C++也不检查这种超界错误。
vector和array对象能够禁止这种行为吗?可以选择使用成员函数at()。
a2.at(1) = 2.3;   //将2.3放到a2[1]位置。
使用at()时,将在运行期间捕获非法索引,而程序默认将中断。这种额外的检查的代价是运行时间更长,这就是C++让允许您使用任何一种表示法的原因所在。








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值