C++ STL-array容器

本文详细介绍了C++标准库中的array容器,包括其特点、创建方式和常用成员函数。array作为固定大小的序列容器,提供了一种更安全的数组操作方式。内容涵盖array的基本操作,如初始化、访问元素、容器大小查询以及成员函数如begin(), end(), fill()等的使用。此外,还展示了如何通过swap()函数交换两个array容器的内容以及使用auto简化代码的示例。
摘要由CSDN通过智能技术生成

array容器是一种序列容器,可以理解为在普通数组的基础上,增加一些成员函数和全局函数的修改,致使功能完备。

而有一点是,array容器的大小是固定的,它无法如vector容器动态的扩展或收缩存储空间,因此array容器只能用于访问或替换存储的元素,无法增加或移除容器内的元素。

在使用array容器时,需要引进<array>的头文件;

#include<array>
using namespace std;

创建array容器简单语法:

 array<数据类型T,容器大小N> 容器命名 {};

其中,必须指明具体的存储数据类型T, 而容器大小N也必须是常量,不能用变量去表示。(以int型为例创建存储量十个元素的array容器):

array<int, 10> Box1 {};

此时,array容器中的元素被初始化为0。

Box1
0000000000

 当然,我们也可以像创建普通数组一样对其进行初始化:

array<int, 10> Box2 {1,2,3,4,5};
Box2
1234500000

前置5位的元素会被赋予初值,而其余的元素仍然默认为0。

array容器的创建和原理了解之后,下面是array容器的其他功能型成员函数,可以在容器中直接使用

array容器成员函数汇总
成员函数功能
begin()返回指向容器中第一个元素的随机访问迭代器。
end()返回指向容器最后一个元素之后一个位置的随机访问迭代器,通常和 begin() 结合使用。
rbegin()返回指向最后一个元素的随机访问迭代器。
rend()返回指向第一个元素之前一个位置的随机访问迭代器。
cbegin()和 begin() 功能相同,只不过在其基础上增加了 const 属性,不能用于修改元素。
cend()和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crbegin()和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crend()和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
size()返回容器中当前元素的数量,其值始终等于初始化 array 类的第二个模板参数 N。
max_size()返回容器可容纳元素的最大数量,其值始终等于初始化 array 类的第二个模板参数 N。
empty()判断容器是否为空,和通过 size()==0 的判断条件功能相同,但其效率可能更快。
at(n)返回容器中 n 位置处元素的引用,该函数自动检查 n 是否在有效的范围内,如果不是则抛出 out_of_range 异常。
front()返回容器中第一个元素的直接引用,该函数不适用于空的 array 容器。
back()返回容器中最后一个元素的直接应用,该函数同样不适用于空的 array 容器。
data()返回一个指向容器首个元素的指针。利用该指针,可实现复制容器中所有元素等类似功能。
fill(val)将 val 这个值赋值给容器中的每个元素。
array1.swap(array2)交换array1和array2容器中的所有元素,但前提是它们具有相同的长度和类型

注意:在C++标准库中也存在begin()和end()这两个函数,和array容器包含的begin()和end()成员函数并非完全相同,标准库提供的这两个函数的操作对象既可以是容器也可以是普通数组。当操作对象是容器时,和array容器中的功能相同;当操作对象是普通数组时,则函数返回的不再是随机访问迭代器,而是返回指针。且begin()返回指向数组的第一个元素的指针,而end()是返回数组中最后一个元素之后一个位置的指针。

选取部分功能成员函数示例:

#include<iostream>
#include<array>//引入array容器头文件
using namespace std;

int main() {
	array<int, 5> Box1{};
	for (int i = 0; i < 5; i++) {//利用at(n)函数初始化使得Box{1,2,3,4,5}
		Box1.at(i) = i + 1;
	}
	array<int, 5>Box2{5,4,3,2,1};
	Box2.swap(Box1);//交换容器Box1和Box2所有元素
	if (!Box1.empty()) {//判断容器是否为空,若不为空,则输出所有元素
		for (auto i = Box1.begin(); i < Box1.end(); i++) {
			cout << *i << " ";
		}
	}
	cout << endl;
	cout << "--------------" << endl;
	if (!Box2.empty()) {
		for (auto i = Box2.begin(); i < Box2.end(); i++) {
			cout << *i << " ";
		}
	}
	return 0;
}

 运行结果:

 5 4 3 2 1
--------------
1 2 3 4 5

 注意:其中auto关键字,可以使编译器自动甄别变量的类型,也就是根据后面的值,来自行推测前面的类型应该是什么;auto的作用就是为了简化变量初始化。

而需要注意的是,以auto声明的变量必须已经被初始化,已经涵盖有元素,否则将会报错。

因为auto只是一个占位符,并不是如模板中数据类型参数,因此也就不能用于类型转换或其他的一些操作。(以上代码,只是简单的用auto替代int)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值