C++11 array 新增容器 (详细讲解 附带代码及其截图)

2 篇文章 0 订阅

array容器概念

  • 要包含的头文件 #include <array>
  • array 容器是 C++ 11 标准中新增的序列容器,简单地理解,它就是在 C++普通数组的基础上,添加了一些成员函数和全局函数。
  • array是将元素置于一个固定数组中加以管理的容器。
  • array可以随机存取元素,支持索引值直接存取, 用[]操作符或at()方法对元素进行操作,也可以使用迭代器访问 。
  • 不支持动态的新增删除操作。
  • array可以完全替代C语言中的数组,使操作数组元素更加安全!

array特点

  • array 容器的大小是固定的,无法动态的扩展或收缩,这也就意味着,在使用该容器的过程无法增加或移除元素而改变其大小,它只允许访问或者替换存储的元素。

  • STL 提供有可动态扩展或收缩存储空间的 vector 容器

array对象的构造

array 容器采用模板类实现,array对象的默认构造形式

array<T,B> A;
T为存储类型,为数值型模板参数
B为存储大小,及容器大小
A为对象名

代码示例

#include <iostream>
#include <array>

using namespace std;

class Son {
public:
	Son() {
		m_age = 0;
	}

	~Son() {

	}

private:
	int m_age;
};

int main(void) {

	array<int, 5> a1;
	array<float, 4> a2;
	array<Son, 2> a3;

	system("pause");

	return 0;
}

构造函数
array<int, 5> a1; //一个存放5个int的array容器
array<float, 4> a2; //一个存放4个float的array容器
array<Son, 2> a3; //一个存放2个Son的array容器

array的赋值

assign() 的赋值
a1.assign(666); //玩法一 改变array中所有元素 (注:将被废弃,不推荐使用)

在VS2019中编译会出现这样的错误,因为这个后面将会被废弃,所以不建议使用这个
在这里插入图片描述
而我们要使用解决这个方法,得在头部加上一个宏定义才能通过编译

#define _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING

#define _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING 

#include <iostream>
#include <array>

using namespace std;

class Son {
public:
	Son() {
		m_age = 0;
	}

	~Son() {

	}

private:
	int m_age;
};

int main(void) {

	array<int, 5> a1;
	array<float, 4> a2;
	array<Son, 2> a3;

	a1.assign(666);	//将a1中的元素全部变成666

	for (unsigned int i = 0; i < a1.size(); i++) {	//通过下标方式查看a1中的元素
		cout << a1[i] << " ";
	}

	cout << endl;
	system("pause");

	return 0;
}

这样就可以通过编译,然后再通过下标的方式打印输出a1中的元素均为666
在这里插入图片描述

和上面的assign()效果一样,而这个不需要添加宏定义也能通过编译,所以我们可以用这个
a1.fill(888); //玩法二 用特定值填充array中所有元素

在这里插入图片描述
打印出来的结果也都是888
在这里插入图片描述

如果我们没有初始化完,那么后面的值默认为 0
初始化不能越界,否则会报错
array<int, 5> a1={1, 2, 3, 4, 5};// 玩法三 定义时使用初始化列表

在这里插入图片描述
输出的结果
在这里插入图片描述

和刚刚的用法效果一样
array<int, 5> a1;
test={1, 2, 3, 4, 5}; //玩法四 定义后使用列表重新赋值

在这里插入图片描述
输出的结果
在这里插入图片描述

通过赋值的方式
array<int, 5> a1,a4;
a1={1,2,3,4};
a2 = a1; //玩法五,赋值运算

在这里插入图片描述
打印出来的结果可以看到都是一样的
在这里插入图片描述

a1.swap(a2); //玩法六 和其它array进行交换

#include <iostream>
#include <array>

using namespace std;

int main(void) {
	array<int, 5> a1, a2;
	a1.fill(888);
	a2.fill(666);

	cout << "a1 中的值: ";
	for (unsigned int i = 0; i < a1.size(); i++) {	//通过下标方式查看a1中的元素
		cout << a1[i] << " ";
	}

	cout << endl;

	cout << "a2 中的值: ";
	for (unsigned int i = 0; i < a2.size(); i++) {	//通过下标方式查看a2中的元素
		cout << a2[i] << " ";
	}

	cout << endl;

	a1.swap(a2);	//和a2进行交换之后
	cout << "-----------swap 之后--------" << endl;

	cout << "交换后a1 中的值: ";
	for (unsigned int i = 0; i < a1.size(); i++) {	//通过下标方式查看a1中的元素
		cout << a1[i] << " ";
	}

	cout << endl;

	cout << "交换后a2 中的值: ";
	for (unsigned int i = 0; i < a2.size(); i++) {	//通过下标方式查看a2中的元素
		cout << a2[i] << " ";
	}

	cout << endl;


	system("pause");
	return 0;
}

会发现输出的值都改变了
在这里插入图片描述

array的大小

array.size(); //返回容器中元素的个数

#include <iostream>
#include <array>

using namespace std;

int main(void) {
	array<int, 5> a1;
	array<int, 10> a2;

	cout << "a1 的大小 " << a1.size() << endl;

	cout << "a2 的大小 " << a2.size() << endl;
	

	system("pause");
	return 0;
}

可以返回array 容器定义的大小
在这里插入图片描述

array.empty(); //永远为 false

在这里插入图片描述
在这里插入图片描述

array.max_size(); //返回容器中最大元素的个数,同size()

array的数据存取

第一 使用下标操作 a1[0] = 100;
第二 使用at 方法 如: a1.at(2) = 100;
第三 接口返回的引用a1.front() 既数组第一个元素和 a1.back() 既数组最后一个元素
注意: 第一和第二种方式必须注意越界

#include <iostream>
#include <array>

using namespace std;

int main(void) {
	array<int, 5> a1;
	array<int, 5> a2;
	array<int, 5> a3;

	a1.fill(888);	//全部初始化为888
	a2.fill(777);	//全部初始化为777
	a3.fill(666);	//全部初始化为666

	//使用下标修改
	a1[0] = 12;
	a1[1] = 100;
	
	//使用at方法修改
	a2.at(1) = 99;
	a2.at(2) = 10;

	//使用front() 和 back()
	a3.front() = 111;
	a3.back() = 222;

	cout << "a1 中的值: ";
	for (unsigned int i = 0; i < a1.size(); i++) {
		cout << a1[i] << " ";
	}
	cout << endl;

	cout << "a2 中的值: ";
	for (unsigned int i = 0; i < a2.size(); i++) {
		cout << a2[i] << " ";
	}
	cout << endl;

	cout << "a3 中的值: ";
	for (unsigned int i = 0; i < a3.size(); i++) {
		cout << a3[i] << " ";
	}
	cout << endl;

	system("pause");
	return 0;
}

然后就可以看到输出的结果都是修改过的结果
在这里插入图片描述

array 迭代器访问

array.begin(); //返回容器中第一个数据的迭代器。
array.end(); //返回容器中最后一个数据之后的迭代器。
array.rbegin(); //返回容器中倒数第一个元素的迭代器。
array.rend(); //返回容器中倒数最后一个元素的后面的迭代器。
array.cbegin(); //返回容器中第一个数据的常量迭代器。
array.cend(); //返回容器中最后一个数据之后的常量迭代器。
array.crbegin(); //返回容器中倒数第一个元素的常量迭代器
array.crend(); //返回容器中倒数最后一个元素的后面的常量迭代器

#include <iostream>
#include <array>

using namespace std;

int main(void) {
	array<int, 5> a1;
	a1 = { 9, 8, 7, 6, 5 };

	//使用普通迭代器输出
	cout << "----------使用普通迭代器输出----------" << endl;
	for (array<int, 5>::iterator it = a1.begin(); it != a1.end(); it++) {
		cout << *it << " ";	//可以修改 *it的值  如 *it -= 1;
	}
	cout << endl << endl;

	//使用常量迭代器
	cout << "----------使用常量迭代器----------" << endl;
	for (array<int, 5>::const_iterator it = a1.cbegin(); it != a1.cend(); it++) {
		cout << *it << " ";	//不可以修改 *it的值
	}
	cout << endl << endl;;

	//使用逆向迭代器  也就是逆向输出array容器中的值
	cout << "----------使用逆向迭代器----------" << endl;
	for (array<int, 5>::reverse_iterator it = a1.rbegin(); it != a1.rend(); it++) {
		cout << *it << " ";	//可以修改 *it的值  如 *it -= 1;
	}
	cout << endl << endl;;

	//使用常量逆向迭代器  也就是逆向输出array容器中的值
	cout << "----------使用常量逆向迭代器----------" << endl;
	for (array<int, 5>::const_reverse_iterator it = a1.crbegin(); it != a1.crend(); it++) {
		cout << *it << " ";	//不可以修改 *it的值
	}
	cout << endl << endl;;

	system("pause");
	return 0;
}

打印输出可以看到我们结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随你而归的云彩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值