C++基础之容器——array详解

头文件
:头文件中定义了固定大小的数组容器array 类和两个函数begin和end。

模板类定义

原型定义

template < class T, size_t N > class array;

类介绍

数组array是一个大小固定的序列容器:容器中保存这特定数量的元素,元素按照严格的线性序列保存。
在容器内部,除了容器的元素不会保存任何其他的数据(甚至大小也不保存,大小是模板类的参数,在编译时确定)。就存储大小而言它与使用括号语法([])声明的数组一样高效。这个类只是在数组的基础上添加了成员函数和全局函数,这样数组就可以当作标准容器来使用。
与其他标准容器不同,array的大小是固定的,而且不会通过一个内存分配器来管理元素内存的分配:它是一个封装了固定数量元素的数组的聚合类型。因此,它不能动态的添加或删除元素(类似的大小可扩展的容器参见vector)。
大小为0的数组是有效的,但是不能对元素进行访问( 成员函数front、back、data)。
与标准库中的其他容器不同,交换两个array的内容,不管是全部交换还是只交换一个范围内的元素(通常效率非常地的操作),时间复杂度都是线性的。同时还使迭代器保留对原始数组的引用。
array的另一个独有的特征是,可以把array当作一个tuple对象来看待:<array>头文件中重载了get函数使array像tuple一样访问元素,还有指定的tuple_size和tuple的元素类型。

容器属性

顺序存储
容器中的元素以严格的线性序列存储。每个元素都可以通过它在序列中的位置来访问。
连续存储
容器的元素保存在一段连续的内存空间中,因此可以以常数时间复杂度来访问任意的元素(O(1))。可以通过使用指向一个元素的指针加上偏移来访问另一个元素。
大小固定
容器使用隐藏构造函数和析构函数来静态的申请和释放内存空间。容器的大小是编译时常量。没有内存或时间开销。

模板参数

T
元素的类型,别名为成员类型array::alue_type。
N
array的大小,元素的数量。

在成员函数中的参数假定与模板参数的名称相同。

成员类型

以下的别名是array的成员类型,他们广泛用于成员函数的参数和返回类型。
在这里插入图片描述

成员函数

std::array::begin

函数原型

     iterator begin() noexcept;
const_iterator begin() const noexcept;

功能
返回一个指向array容器第一个元素的迭代器。注意:与array::front函数(返回第一个元素的引用)不同,begin返回的是指向第一个元素的可以随机访问的迭代器。
在大小为0的数组中,返回值与array::end相同,但是返回的迭代器不应该解引用来访问元素。
参数

返回值
一个指向序列开始的迭代器。如果array是const的,则返回一个const_iterator,否则返回一个iterator。
成员类型iterator和const_iterator都是可以随机访问的(分别指向普通元素和静态的元素)。
Example

// array::begin example
#include <iostream>
#include <array>

int main ()
{
  std::array<int,5> myarray = { 2, 16, 77, 34, 50 };

  std::cout << "myarray contains:";
  for ( auto it = myarray.begin(); it != myarray.end(); ++it )
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

Output:

myarray contains: 2 16 77 34 50

复杂度
常数
迭代器有效性
不会修改迭代器的有效性。
数据竞争
该函数不会访问array的元素,但是返回的迭代器可以访问和修改元素。同时访问或修改元素是安全的。
异常&安全
保证不抛出异常: 该函数永远不会抛出异常。拷贝构造或在对返回的迭代器赋值都不会抛出异常。

std::array::end

函数原型

         iterator end() noexcept;
const_iterator end() const noexcept;

功能
返回一个指向array容器the past-the-end element的迭代器。
the past-the-end element是一个理论上的元素,在array最后一个元素的下一个位置。它不指向任何的元素,因此不能解引用来访问元素。
由于标准库函数访问元素范围不包括终止迭代器指向的元素,因此该函数通常用来与array::begin一起使用来指定容器的元素范围。
在大小为0的数组中,返回值与array::begin相同,但是返回的迭代器不应该解引用来访问元素。
参数

返回值
一个指向序列最后一个元素的下一个位置的迭代器。如果array是const的,则返回一个const_iterator,否则返回一个iterator。
成员类型iterator和const_iterator都是可以随机访问的(分别指向普通元素和静态的元素)。
Example

// array::end example
#include <iostream>
#include <array>

int main ()
{
  std::array<int,5> myarray = { 5, 19, 77, 34, 99 };

  std::cout << "myarray contains:";
  for ( auto it = myarray.begin(); it != myarray.end(); ++it )
    std::cout << ' ' << *it;

  std::cout << '\n';

  return 0;
}

Output:

myarray contains: 5 19 77 34 99

复杂度
常数
迭代器有效性
不会修改迭代器的有效性。
数据竞争
该函数不会访问array的元素,但是返回的迭代器可以访问和修改元素。同时访问或修改元素是安全的。
异常&安全
保证不抛出异常: 该函数永远不会抛出异常。拷贝构造或在对返回的迭代器赋值都不会抛出异常。

<
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值