需要头文件
命名空间为std
定义为class template
namespace std {
template
class array;
}
包覆一个静态c数组并提供了一个STL容器接口。有固定大小,无法增加或者删除,有固定大小。只能改变元素值。
第二个参数为生命周期内元素的个数,size()函数 返回值总等于N
array会将元素复制到内部的c数组,是有序的,且支持随机访问。内存分配在栈中,绝不会被重新分配

初始化

array特殊的地方是,默认构造产生的不是空容器,元素数量一定是第二个参数N。初值可能不明确,不一定是0。
arrayx;//x内的元素值不确定
arrayx1 = {};//x1内的元素都为0 (int())
arrayx2 = { 1,2,3,4 };//正常的一个初始化
arrayx3 = { 3 };//第一个元素是3,后面的是0
如果元素数量超过N值,会出现错误

array的swap操作可以和一个元素类型和元素个数都相同的容器置换彼此的元素,但迭代器和引用不会改变所指 的容器。

大小

array大小可以是0,此时begin()和end(),cbegin()和cend()都会释出同一个值。但是front()和back()返回的就不明确了。

建立赋值和删除操作

操作 结果
array<Elem,N> c 某人构造,有默认参数表
array<Elem,N> c(c2) 复制构造,建立另一个同类型array并复制所有元素
array<Elem,N> c = c2 同上
array<Elem,N> c = initlist 给初始化参数列来建立一个array

非变动性操作


操作
结果
c.empty() 返回是否为空
c.size() 返回目前的元素个数,都是N
c.max_size() 返回元素个数的可能最大值
== 对每个元素调用了==
!= 相当于!(==)
<  
>  
<= 相当于!(<)
>= 相当于!(>)

赋值

除了赋值操作符之外,只能用fill()赋新值给每一个元素

操作 结果
c = c2 将c2元素给c
c.fill(value) 将value的值赋给c中的每一个元素
c1.swap(c2) 置换c1和c2的数据
swap(c1.c2) 同上,此函数是全局函数

元素访问

访问array内的所有元素,需要使用范围for循环,或者特定操作函数或迭代器。

也可以像c数组一样,第一个元素索引是0,最后一个是size()-1.

操作 结果
c[index] 返回索引所指向的元素,不检查范围
c.at(index) 返回索引指向的元素,会检查范围,超过范围抛出范围错误异常
c.front() 返回第一个元素,不检查是否存在第一个元素
c.back() 返回最后一个元素,不检查是否存在最后一个

迭代器相关函数

array提供的是随机访问迭代器,原则上对array可以用STL的所有算法

操作 效果
c.begin() 返回迭代器指向第一个元素
c.end() 指向最后一个
c.cbegin() 返回一个const迭代器指向第一个,c11
c.cend() 只想最后一个的const迭代器,c11
c.rbegin() 返回一个反向的迭代器指向第一个元素
c.rend() 返回一个反向的迭代器指向最后一个元素
c.crbegin() 返回一个const反向指向第一个的迭代器,c11
c.crend() 返回一个const反向指向最后一个的迭代器,c11

对于array来说,begin(),end(),cbegin(),cend()返回的是普通指针。并且只要array有效,其迭代器也保持有效,并且swap()函数是将新值赋给迭代器、引用、指针指向的元素上。

Tuple接口

array提供tuple接口

 typedef array FiveStrings;
     FiveStrings a = { "h","e","l","l","o" };
     cout<< tuple_size::value;//取得元素个数
     tuple_element<1,FiveStrings>::type;//获取特定的元素类型
     get<1>(a);//取得某特定元素

实例

#include "print.h"

int main()
{
	array a = { 11,22,33,44 };

	print(a);
	a.back() = 999999;
	a[a.size() - 2] = 42;
	print(a);

	cout << "sum: " << accumulate(a.begin(), a.end(), 0);

	transform(a.begin(), a.end(), a.begin(), negate());
	print(a);
}



11 22 33 44000000 
11 22 33 4400 0 0 42 999999 
sum: 1000151-11 -22 -33 -44 0 0 0 0 
—999999