STL学习笔记— —容器array

版权声明:Sin_Geek笔记与总结,欢迎分享讨论~~ https://blog.csdn.net/lyh03601/article/details/51067874

简介

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
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页