您的位置:首页 > 编程语言 > C语言/C++

C++每日一课(十六)

2017-07-09 14:50 267 查看
C++中数组的替代品

vector、array

一、模板类vector

它与string类似,是一种动态数组,可以在运行阶段设置vector对象的长度,可以在末尾加上新的数据,也可以在中间再插入数据。

实际上可以使用new创建动态数组的替代品,而vector类确实是使用new和delete来管理内存,但这个工作是自动完成的。

使用vector的关键点

1.要包含头文件vector

2.包含名称空间std中 std::vector

3.模板使用不同的语法来指出它存储的数据类型

4.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的初始长度设置为0,但是要调整长度是需要使用到vector包中的方法的。

一般来说声明创建一个名为vt的vector对象,它可存储n_elem个类型为typeName的元素

vector<typeName> vt(n_elem);

注意:n_elem可以是整型常量也可以是整型变量

二、模板类array

vector类的功能是比数组强大,但是它的效率很低,如果需要长度固定的数组,使用数组是更好的选择,只是不那么方便。

C++中新新增了模板类array,它也是位于名称空间std中,与数组一样,array对象的长度也是固定的,也使用栈(静态内存分配),而不是自由存储区,因而它的效率与数组相同,但是更方便、安全

要创建array对象,需要包含头文件array.

#include <array>

……

using namespace std;

array<int,5> ai; //声明时指定存储的长度及存储数据的类型

array<double,4> ad={1.0,1.1,1.2,1.3};

声明创建一个名为arr的array对象,它包含n_elem个类型为typeName的元素

array<typeName,n_elem> arr;

注意:与vector对象不同的是,n_elem不可以是变量

三、对数组、vector、array的比较

/*
作者:xiesheng
时间:2017-07-09
版本:v1.0
说明:指针
*/
#include <iostream>
#include <vector>
#include <array>

int main() {

using namespace std;

//double a1[4]{1.2,2.4,3.6,4.8};
double a1[4] = { 1.2,2.4,3.6,4.8 };

//vector
vector<double> a2(4);
//初始化vector中的值
a2[0] = 1.0 / 2.0;
a2[1] = 1.0 / 5.0;
a2[2] = 1.0 / 7.0;
a2[3] = 1.0 / 9.0;

//array
//array<double, 4> a3{3.14,2.72,1.62,1.41};
array<double, 4> a3 = { 3.14,2.72,1.62,1.41 };
array<double, 4> a4;
a4 = a3;	//把一个arry对象赋值给另一个array对象,两个对象需要有相同的长度

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;

cout << 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;

system("pause");
return 0;
}


a1[2]:3.6 at 0053EFDC

a2[2]:0.142857 at 00A9A9D8

a3[2]:1.62 at 0053F01C

a4[2]:1.62 at 0053EFFC

a1[-2]:20.2 at 0053EFBC

a3[2]:1.62 at 0053F01C

a4[2]:1.62 at 0053EFFC

请按任意键继续. . .

1.无论是数组、vector、array都可以使用标准数组表示法来访问各个元素

2.从地址来看array对象与数组存储在相同的内存区域即栈中,vector则存在另一个区域(自由存储区或堆)

3.可以把array对象赋值给另一个array对象,对于数组来说需要一个一个元素进行复制数据

a1[-2] = 20.2;  

这里索引-2?

可以转成如下代码

*(a1-2) = 20.2;

找到a1指向的地方,向前移两个double元素并把20.2存储在这个位置,也就是把数据存在数组的外面;

C++中是不会检查这种数组越界的错误的

可以选择一种使用成员函数at()

a2.at(1) = 2.3; //也就是把a2[1] = 2.3

使用at()的差别在于,at在运行期间会捕获非法索引,而程序默认会中断,这种额外的检查的代价是运行时间变的更长了。

另外还可以使用成员函数begin()、end()来确定边界,以免无意间超界
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++每日一课 c++ 编程