C++每日一课(十六)

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()来确定边界,以免无意间超界

猜你喜欢

转载自blog.csdn.net/advent86/article/details/74882975