STL学习笔记— —容器array

简介

array在头文件<array> 中定义

namespace std
{
    template<class T, size_t N> 
    class array;
}

array是固定元素个数的容器,与相应C数组的语义相同,容器array< T,N> 的大小等于相应C数组T[N]的大小,且性能也与C数组相同。但是它提供了C++标准容器的相应特性,如可以查询容器大小,支持复制,支持随机迭代器等等。不支持设置分配器。

这里写图片描述

对于长度为0的std::array< T,0>存在一个特例。此时array.begin() == array.end(),且等于某个特定值。对这种array调用front()或back()的行为是未定义的。

array是一个简单集合(没有构造函数,也没有私有或保护成员),同时也可以当作一个有N个相同类型元素的tuple。

数组操作

构造、复制与析构

array<Elem,N> c //默认构造函数; 创建一个默认初始化的数组

array<Elem,N> c(c2) //复制构造函数; 创建另一个与c2同型的vector副本(所有元素都被复制)

array<Elem,N> c = c2 //复制构造函数; 创建另一个与c2同型的vector副本(所有元素都被复制)

array<Elem,N> c(rv) //移动构造函数; 拿走右值rv的元素创建一个新的数组

array<Elem,N> c = rv //移动构造函数; 拿走右值rv的元素创建一个新的数组

array<Elem,N> c = initlist //使用初始化列表创建一个初始化的数组

非变动性操作

c.empty() //判断容器是否为空,与size()==0相同,但可能更快

c.size() //返回当前元素数量

c.max_size() //返回可容纳的元素最大数量

c1 == c2 //判断c1与c2是否相等

c1 != c2 //判断c1与c2是否不相等,等同于!(c1==c2)

c1 < c2 //判断c1是否小于c2

c1 > c2 //判断c1是否大于c2

c1 <= c2 //判断c1是否小于等于c2

c1 >= c2 //判断c1是否大于等于c2

赋值

c = c2 //将c2所有元素赋值给c

c = rv //将右值对象rv的所有元素移动赋值给c

c.fill(val) //将val赋值给数组c里的每个元素

c1.swap(c2) //交换c1和c2的数

swap(c1,c2) //交换c1和c2的数

元素存取

c[idx] //返回索引idx所标示的元素,不进行范围检查

c.at(idx) //返回索引idx所标示的元素,如果越界,抛出range-error

c.front() //返回第一个元素,不检查第一个元素是否存在

c.back() //返回最后一个元素,不检查最后一个元素是否存在

迭代器相关函数

c.begin() //返回一个随机存取迭代器,指向第一个元素

c.end() //返回一个随机存取迭代器,指向最后一个元素

c.cbegin() //返回一个随机存取常迭代器,指向第一个元素

c.cend() //返回一个随机存取常迭代器,指向最后一个元素

c.rbegin() //返回一个逆向迭代器,指向逆向迭代的第一个元素

c.rend() //返回一个逆向迭代器,指向逆向迭代的最后一个元素

c.crbegin() //返回一个逆向常迭代器,指向逆向迭代的第一个元素

c.crend() //返回一个逆向常迭代器,指向逆向迭代的最后一个元素

栗子

#include <string>
#include <iterator>
#include <iostream>
#include <algorithm>
#include <array>

using namespace std;
int main()
{
    // 使用列表初始化来构造
    array<int, 3> a1{{1,2,3}};    // C++11中需要使用双重花括号
    array<int, 3> a2{1, 2, 3}; // C++14直接使用一层花括号即可
    array<std::string, 2> a3 = { {string("a"), "b"} };

    // 支持基本的容器操作
    sort(a1.begin(), a1.end());
    reverse_copy(a2.begin(), a2.end(), ostream_iterator<int>(cout, " "));

    // 支持范围for
    for(auto& s: a3)
        cout << s << ends;
}

输出

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值