c++标准库之数组

简介

std::array 是对C-style array 的一个类封装,并提供一些成员保证数组的安全使用。它位于头文件中,使用时候需要:#include <array>

定义

namespace std {
    
    
    template <typename T, size_t N>
    class array;
}
  1. T 指定为数组可以为任意类型
  2. N 指定数组的大小 因此数组的size()成员结果总是N,不能动态扩容

初始化

std::array<int, 4> a; // 拥有4个int元素的数组,每个元素值为随机值
std::array<int, 4> a = {
    
    }; // 拥有4个int元素的数组,每个元素值为0
std::array<int, 4> a = {
    
    1, 2, 3, 4}; // 拥有4个int元素的数组,元素一次初始化为1, 2, 3, 4
std::array<int, 4> a = {
    
    1}; // 拥有4个int元素的数组, 第一个元素初始化为1, 其余的都初始化为0
std::array<int, 4> a = {
    
    1, 2, 3, 4, 5}; // 错误,初始化列表的最大个数不能超过指定数组的大小 并不可以动态扩容

数组的操作

  1. 构造
  • array<Elem, N> c 默认构造一个数组,元素如果是对象调用对象构造函数,如果是内置类型,那么为随机值。
  • array<Elem, N> c(c2) 拷贝构造函数,建立另外一个数组,所有的元素都会被复制到新建的数组中
  • array<Elem, N> c(rv) 移动构造, 取右值的内容建立一个新的数组。
  • array<Elem, N> c = rv 移动构造, 取右值的内容建立一个新的数组。
  • array<Elem, N> c = initlist 列表初初始化,使用列表中的值构造一个新的数组,如果列表中元素不够,剩下的补0,超出编译错误
  1. 交换
  • array<Elem, N>::swap() 只能交换元素类型和元素个数都相同的数组
  1. 大小
  • array<Elem, N>::size() size的值为N, 如果N为0, 那就是没有任何元素的的数组,这种情况下, 迭代器begin() 、end() cbegin()、 cend()会返回同一个值,但是front()和back() 返回的值就是不明确的,data()返回的值也不要使用它。
  1. 访问
  • c[index] 随机访问,返回index处的值,(不检查范围)
  • c.at(index) 返回idnex处的值,(检查范围,如果超出范围,那么抛出range-error异常)
  • c.front() 返回第一个元素 (不检查范围,小心数组越界)
  • c.back() 返回最后一个元素 (不检查范围,小心数组越界)
  • c.begin() 返回一个随机迭代器,指向数组第一个元素
  • c.end() 返回一个随机迭代器,指向数组最后一个元素的下一个位置
  • c.cbegin() 返回一个常量随机迭代器,指向数组第一个元素
  • c.cend() 返回一个常量随机迭代器,指向数组最后一个元素的下一个位置
  • c.rbegin() 返回一个反向迭代器,指向反向迭代器第一个元素,也就是数组最后一个元素
  • c.rend() 返回一个反向迭代器, 指向反向迭代器最后一个元素,数组第一个元素的前一个位置
  1. array当做c风格数组
  • &a[i] = &a[0] + i 和c风格素组类似,第i个元素可以使用数组首地址 + 偏移量 比如strcpy(&a[0] + 3, “hello”);
  • a.data() 返回素组首地址,在使用时候一定要检查一下大小,千万别数组越界了,比如strcpy(a.data(), “hello”);
  1. 异常处理
  • 只有at()函数才做数组越界检查,越界以后会抛出range-eeor异常,其他函数都不会抛出异常,也不会做异常检查。一切都只能靠自己

数组小demo

#include <iostream>
#include <array>

template<typename T, std::size_t N>
std::ostream &operator<<(std::ostream &os, const std::array<T, N> &arr) {
    
    
    os << "[";
    // 随机遍历 使用下标
    for (std::size_t i = 0; i < N; ++i) {
    
    
        os << arr[i];
        if (i != N - 1) {
    
    
            os << ", ";
        }
    }
    os << "]";
    return os;
}
int main()
{
    
    
    system("chcp 65001");
    // 初始化
    std::array<int, 4> a1; 
    std::cout << "a1:" << a1 << std::endl;
    std::array<int, 4> a2 = {
    
    }; 
    std::cout << "a2:" << a2 << std::endl;\
    std::array<int, 4> a3 = {
    
     1, 2, 3, 4 };
    std::cout << "a3:" << a3 << std::endl;
    std::array<int, 4> a4 = {
    
     1 }; 
    std::cout << "a4:" << a4 << std::endl;

    std::cout << "交换a1, a2" << std::endl;
    a1.swap(a2);
    std::cout << "a1:" << a1 << " a2:" << a2 << std::endl;
    std::cout << "move a4 到 a3" << std::endl;
    a3 = std::move(a4);
    std::cout << "a3:" << a3 << " a4:" << a4 << std::endl;

    // 迭代器遍历
    auto begin = a1.begin();
    auto end = a1.end();
    std::cout << "遍历a1: [";
    while (begin != end)
    {
    
    
        std::cout << *begin << ", ";
        begin++;
    }
    std::cout << "]" << std::endl;
    // 范围for遍历
    std::cout << "范围for 遍历a1: [";
    for (int item : a1)
    {
    
    
        std::cout << item << ", ";
    }
    std::cout << "]" << std::endl;
    return 0;
}

输出

Active code page: 65001
a1:[-858993460, -858993460, -858993460, -858993460]
a2:[0, 0, 0, 0]
a3:[1, 2, 3, 4]
a4:[1, 0, 0, 0]
交换a1, a2
a1:[0, 0, 0, 0] a2:[-858993460, -858993460, -858993460, -858993460]
move a4 到 a3
a3:[1, 0, 0, 0] a4:[1, 0, 0, 0]
遍历a1: [0, 0, 0, 0, ]
范围for 遍历a1: [0, 0, 0, 0, ]

猜你喜欢

转载自blog.csdn.net/qq_33944628/article/details/132817971