Cherno C++ P57 Standard array处理静态数组

这篇文章当中我们讲一下如何使用C++自带的standard array来处理静态数组。

首先什么是静态数组,静态数组通常指的是不会增长的数据,长度是已经确定了的。我们在定义数组的时候就必须确定好长度与类型。

其次C++当中也确实给我们提供了一些可以用来处理静态数组的办法,之前已经介绍过的包括原始数组和STL vector,而C++ library当中还为我们提供了另一个,就是array类型。array的使用方式如下所示:

#include<array>
std::array<int, 5> data;

可以看到,array是基于模板的,我们在定义的时候会分别确定数组的类型与长度。这种写法与C语言类型的数组是相同的,不过目前我们不会深入了解这一部分。

使用array的一个好处是,因为它实际上是一个模板类,所以我们终于可以获得一个数组的长度了,通过调用array.size()就可以获取其长度:

std::array<int, 5> data;
int a = data.size();

如果我们获得一个原始数组,我们希望能够循环打印它的元素的时候,我们需要同时传入数组指针以及它的长度:

void print(int* array, int length) {
    for (int i = 0; i < length; i++) {
        std::cout << array[i] << std::endl;
    }
}

但是当我们想要传入一个array数组的时候,我们又遇到了一个难题,就是确实我们不需要传入两个变量,但是array本身就是需要标明它的长度的:

void print(const array<int, 5>& arr)

如果这样的话,好像也是必须得先把长度传入进去才行,这和之前的原始数组就没有什么区别了。那么如何在不知道standard array是多长的情况下传入一个array?我的想法是需要使用模板函数:

template<int T>
void print(const std::array<int, T>& arr) {
    for (int i = 0; i < arr.size(); i++) {
        std::cout << arr[i] << std::endl;
    }
}

这样我们就可以在不知道array有多长的情况下依然顺利的把array给传入进去了。

在内存储存方式上,array与C语言风格的数组是一样的,都是储存在栈当中的。我们可以直接进入到array文件当中就可以找到library定义的array模板类:

其中我们可以直接看到对于内存的分配,就是很简单的一句话:

_Ty _Elems[_Size];

所以很明显这是栈上申请内存。

同样我们可以看到在内存检查的时候代码如下:

#if _CONTAINER_DEBUG_LEVEL > 0
        _STL_VERIFY(_Pos < _Size, "array subscript out of range");

很明显,我们只有在debug模式下才会进行边界检查并打印错误信息,但是在release模式下,array的操作是与普通数组完全一样的,这也带来了array很高的使用效率,所以尽可能使用array是很好的选择,因为一方面它可以为我们提供内存检查与长度信息,另一方面在release版本中又不会影响使用新能。

最后一个小细节就是,如果我们来看size函数:

_NODISCARD constexpr size_type size() const noexcept {
    return _Size;
}

会发现它是直接把我们输入进去的长度返回了,它不会用一个变量储存这个长度信息,因为我们使用的是模板类函数。

以上就是有关于standard array的全部内容了,希望大家喜欢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值