std::array 学习速记

简介

  • std::array 是一个封装了固定大小的数组的容器。
  • 它和有且仅有一个C风格的T[N]数组作为非static成员的struct语义上是一样的。
  • 它把标准容器的好处(比如知道自己的大小,支持赋值操作符,随机访问迭代器… ) 和C风格数组的高效率、易访问结合。除了初始化array的时候不是空的以及swap操作是线性复杂度外, std::array 满足容器和可逆容器的要求。
  • 有一种特殊的array是长度为0的array。 它有些特殊的价值, 它的begin() == end() , 并且frontback() 接口是undefined 。
  • 一个array可以被视作持有N个相同类型的元素的tuple。

功能

C style 基本功能
  • 列表初始化 : 
std::array<int , 4> array_4 = { 1, 2, 3, 4};
  • 支持 [ ] 运算符 。
    • 注意: [ ] 运算符是仍然支持越界存取的!!!
    • 注意: 越界保存的数据, 并不会出现咋data() 接口返回的底层内存中 !!!
C++11 新功能 :
  • at() 接口。

    at() 接口是安全的 [ ] 操作, 当出现数组越界的时候, 会抛出 out_of_range 异常。

  • size()max_size() 接口

    • 当前我使用的gcc (SUSE Linux) 4.8.3 这两个都是返回当前array的N值。考虑到array在构造的时候就根据N值填充, 个人认为这两个接口会一直是同一个意思。
  • empty() 接口 。

    • 注意: 和其他的容器不同,array的empty() 接口检测的是N值是否为0 。也就是说, 只有std::array<T, 0> 类型的array的empty() 接口才会返回true
  • data() 接口 , 返回C style的数组。

    • data()接口并没有另外开辟内存,改变其指向内存的值便改变array内数据 。
  • 视为tuple 的操作: tuple_element , tuple_size 。
  • 比较运算符们
    • 字典比较。

代码

#include <iostream>
#include <array>

int main()
{
    std::array<int ,2> a ={1} ;
    std::cout<<a.size()<<"\n";
    std::cout<<a.max_size()<<"\n";
    std::cout<<a.empty()<<"\n";
    a[1] = 2;
    a[2] = 3;
    std::cout<<a[0] <<"\n";
    std::cout<<a[1] <<"\n";
    std::cout<<a[2] <<"\n";
    a[2] = 4;
    std::cout<<a[2] <<"\n";
    int *p = a.data();
    std::cout<<p[0] <<"\n";
    std::cout<<p[1] <<"\n";
    std::cout<<p[2] <<"\n";
    p[1] =11;
    std::cout<<std::tuple_size<decltype(a)>::value<<"\n";
    std::cout<<a.at(1) <<"\n";
    std::cout<<a.at(2) <<"\n";
    return 0;
}

运行结果 :

2 —-> size
2 —–> max_size
0 —–>empty
1
2
3 —–>越界
4 —–>越界
1
2
-1205258896 —–>越界 , data() 接口不返回越界数据
2 —–> tuple size
11 —-> 改变data()内存,改变array。
terminate called after throwing an instance of ‘std::out_of_range’
what(): array::at
Aborted

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值