【C++学习笔记】vector和array

一、模板类vector

vector使用new和delete来自动管理内存。

1、首先,使用vector要包含头文件vector;

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

3、第三,模板使用不同语法来指出它所存储的数据类型;

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

5、使用方法:

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

由于vector对象在插入或添加值时自动调整长度,因此可以将初始长度设为零。

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

vector类的功能比数组强大,但效率稍低。如果需要长度固定的数组,使用数组更佳,但代价是不方便和不安全。C++11新增模板类array,位于名称空间std中,与数组一样,array对象的长度也是固定的,也是用栈(静态内存分配),而不是自由存储区,因此效率与数组相同,但更方便与安全。

array<typename,n_elem> arr;

与vector不同,n_elem不能是变量。

在C++11中,可将列表初始化用于vector和array,但在C++98中不能。

三、例子

#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);

	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;

	cin.get();
	return 0;
}

索引-2即*(a1-2) = 20.2;

其含义如下:

找到a1指向的地方,向前移两个double元素,并将20.2存储到目的地。即是将信息存储到数组外面。与C语言一样,C++也不检查这种超界错误,在这个示例中,这个位置位于array对象a3中。其他编译器可能将20.2放在a4中,这表明数组的行为是不安全的。

使用成员函数at()或中括号表示法避免不安全的行为

a2.at(1) = 2.3;

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

下面这些类能够降低意外超界错误的概率,如begin()和end()。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值