【C++ STL】array容器


概述

std::array 是 STL 提供的 内存连续的、固定长度 的数组数据结构。只允许访问或者替换存储的元素。其本质是对原生数组的直接封装。

array 相比 vector 牺牲了动态扩容的特性,但是换来了与原生数组几乎一致的性能(在开满优化的前提下)。
因此如果能使用 C++11 特性的情况下,能够使用原生数组的地方几乎都可以直接把定长数组都换成 array,而动态分配的数组可以替换为 vector。

声明与初始化

template<
    class T,
    std::size_t N
> struct array; //C++11

std::array是一个聚合类型,其语义等同于保有一个C语言风格数组T[N]作为其唯一非静态数据成员的结构体,但其不同于C数组的是它不会自动退化为T*。同时该结构体结合了C风格数组的性能、可访问性和容器的优点(可获取大小、支持赋值和随机访问等)。

基础数据类型

//声明一个大小为100的`int`型数组,元素的值不确定
array<int, 100> a;

//声明一个大小为100的int型数组,初始值均为0初始值与默认元素类型等效
array<int, 100> a{
   
   };

//声明一个大小为100的int型数组,初始化部分值,其余全部为0
array<int, 100> a{
   
   1, 2, 3};

//或者可以用等号
array<int, 100> a = {
   
   1, 2, 3};

高级数据类型

不同于原生数组的是对元素类型不做要求,可以套结构体

array<string, 2> s = {
   
   "ha", string("haha")};
array<node, 2> a;

方法函数

方法 含义
长度/容量
size() 返回当前array中元素的数量。 O(1)
empty() 检查当前array是否为空。如果为空,返回true;否则返回false。 O(1)
max_size() 返回array容器的最大可能长度。
访问元素
at(pos) 返回容器中下标为 pos 的引用。如果数组越界抛出 std::out_of_range 类型的异常。O(1)
operator[pos] 访问指定的元素,不进行越界检查
front() 返回首元素的引用。O(1)
back() 返回末尾元素的引用。O(1)
data() 返回指向数组第一个元素的指针。
修改器
fill(value) 用于以指定值填充容器,即将定值 value 赋给容器中的所有元素
swap(array) 交换两个array容器的内容
迭代器
begin() / cbegin() 返回指向首元素的迭代器(地址),其中 *begin = front
end() / cend() 返回指向数组尾端占位符的迭代器,注意是没有元素的。
rbegin() / crbegin() 返回指向逆向数组的首元素的逆向迭代器,可以理解为正向容器的末元素。*rbegin = back
rend() / crend() 返回指向逆向数组末元素后一位置的迭代器,对应容器首的前一个位置,没有元素。

含有字符 c 的为只读迭代器,你不能通过只读迭代器去修改容器中的元素的值。如果一个容器本身就是只读的,那么它的一般迭代器和只读迭代器完全等价。只读迭代器自 C++11 开始支持。

存取元素

  1. at()访问

    //at()函数的原型:
    reference at( size_type pos ); //C++17 前
    constexpr reference at( size_type pos ); //C++17 起
    const_reference at( size_type pos ) const; //C++14 前
    constexpr const_reference at( size_type pos ) const; //C++14 起
    

    at()函数返回指定位置pos处的元素的引用。如果pos超出了有效范围(即大于等于size()),则抛出std::out_of_range异常。

    std::array<int,3> data = {
         
          1, 2, 3};
    
    std::cout<<data.at(1)<<std::endl; //2
    data.at(1)=8; //此时data={1, 8, 3}
    
    data.at(6) = 6; //越界,抛出std::out_of_range异常
    
  2. 下标访问

    //operator[] 函数的原型:
    reference operator[]( size_type pos ); //C++17 前
    constexpr reference operator[]( size_type pos ); //C++17 起
    const_reference operator[]( size_type pos ) const; //C++14 前
    constexpr const_reference operator[]( size_type pos ) const; //C++14 起
    

    operator[]返回指定位置pos处的元素的引用。与at()函数不同的是,若pos超出有效范围,则行为是未定义的。也就是说at越界时会抛出异常,而[]越界不会抛出异常。

    std::array<</
C++ STL中的array是一个固定大小的数组容器,它提供了一组功能完备的操作函数,用于管理和操作数组。 arrayC++内置数组相比,具有以下优势: - 通过array可以方便地获取数组的大小(通过size()函数)和最大容量(通过max_size()函数)。- array提供了一系列的成员函数,如at()、front()、back()等,用于访问和操作数组元素。 - 支持迭代器,可以使用迭代器遍历和修改数组的元素。 - array的大小是固定的,不能动态改变。 以下是一个使用array的简单示例: ```cpp #include <iostream> #include <array> int main() { std::array<int, 5> arr = {1, 2, 3, 4, 5}; std::cout << "Array size: " << arr.size() << std::endl; std::cout << "Array elements: "; for (const auto& element : arr) { std::cout << element << " "; } std::cout << std::endl; arr[2] = 10; std::cout << "Modified array elements: "; for (const auto& element : arr) { std::cout << element << " "; } std::cout << std::endl; return 0; } ``` 上述示例中,我们创建了一个包含5个整数的array容器arr,并初始化为{1, 2, 3, 4, 5}。通过arr.size()可以获取数组的大小,输出结果为5。然后我们使用for循环和迭代器遍历数组的所有元素,并输出到控制台。 接着我们修改数组的第三个元素为10,然后再次遍历数组并输出修改后的结果。 array是一个非常方便和实用的容器,可以用于替代传统的C风格数组,并提供更多的功能和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值