当前位置: 首页 > article >正文

C++11中array容器的常见用法

文章目录

    • 一、概述
    • 二、std::array的特点
    • 三、std::array的定义与初始化
    • 三、std::array的常用成员函数
    • 四、与 C 风格数组的互操作

一、概述

在 C++11 中,std::array 是一个新的容器类型,它提供了一个固定大小的数组封装。相比传统的 C 风格数组,std::array 提供了更多的功能和类型安全性,并且更符合现代 C++ 的风格。std::array 是一个模板类,定义在 头文件中,它封装了固定大小的数组,并提供了更方便的访问和操作方法。

二、std::array的特点

  • 固定大小:std::array 的大小在编译时确定,不能在运行时动态改变。
  • 类型安全:由于 std::array 是模板类,它保证了元素的类型安全,且可以使用类型推断。
  • 支持标准容器接口:std::array 提供了与其他标准容器类似的接口,如 begin(), end(), size(), empty(), at(), [] 等。
  • 可以与 C 风格数组互操作:std::array 可以通过 data() 方法访问底层的 C 风格数组。

三、std::array的定义与初始化

std::array 是一个模板类,其模板参数为元素类型和容器大小。
1. 定义与初始化

#include <iostream>
#include <array>

int main() {
    // 定义一个包含 5 个整数的 std::array
    std::array<int, 5> arr = {1, 2, 3, 4, 5};

    // 访问元素
    std::cout << "arr[0] = " << arr[0] << std::endl;

    // 使用范围 for 循环打印元素
    for (const auto& elem : arr) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

2. 使用 fill() 方法初始化
可以使用 fill() 方法为所有元素赋值相同的值:

std::array<int, 5> arr;
arr.fill(10);  // 所有元素被初始化为 10

3. 通过列表初始化
std::array 还可以通过列表初始化进行初始化:

std::array<int, 3> arr = {1, 2, 3};  // 列表初始化

三、std::array的常用成员函数

std::array 提供了很多类似于其他 STL 容器的成员函数,包括获取容器大小、访问元素、检查是否为空等。
1. size():返回数组的大小
std::array 的 size() 函数用于返回数组中元素的数量。与 std::vector 不同,std::array 的大小是固定的(在编译时已知),所以 size() 返回的是数组的元素总数,而不是动态变化的长度。

#include <iostream>
#include <array>

int main() {
    // 创建一个 std::array,包含 5 个整数元素
    std::array<int, 5> arr = {1, 2, 3, 4, 5};

    // 获取并输出数组的大小
    std::cout << "数组的大小: " << arr.size() << std::endl;  // 输出: 5

    // 使用 size() 来遍历数组
    for (std::size_t i = 0; i < arr.size(); ++i) {
        std::cout << "arr[" << i << "] = " << arr[i] << std::endl;
    }
    
    return 0;
}

运行结果:
请添加图片描述
解释:

  • 在上面的代码中,arr.size() 返回了 5,表示 std::array<int, 5> 中有 5 个元素。
  • size() 是一个常量时间操作,它的返回值是编译时已知的常量,因此非常高效。

注意事项:

  • size() 不会返回数组中有效元素的数量。它返回的是数组的固定大小,即使部分元素没有被赋值,大小依然是固定的;对于 std::array,size() 是编译时确定的固定值。
  • 对于 std::array<T, N>,size() 始终返回 N,而不会随着元素的初始化状态变化;size() 提供了数组的固定大小,返回容器中的元素个数。

通过 size() 使用 std::array:
在许多情况下,你可以使用 size() 来使代码更加灵活。举个例子,如果你需要遍历一个 std::array,使用 size() 可以避免硬编码数组的长度:

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> arr = {10, 20, 30, 40, 50};

    // 使用 size() 来遍历整个数组
    for (auto& value : arr) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

    return 0;
}

2. at():返回指定索引的元素,并进行越界检查

std::array<int, 5> arr = {1, 2, 3, 4, 5};
std::cout << "Element at index 2: " << arr.at(2) << std::endl;  // 输出 3

// 如果索引越界,将抛出 std::out_of_range 异常
try {
    std::cout << arr.at(10) << std::endl;  // 异常
} catch (const std::out_of_range& e) {
    std::cout << e.what() << std::endl;  // 输出异常信息
}

3. operator[]:通过索引访问元素(没有越界检查)

std::array<int, 5> arr = {1, 2, 3, 4, 5};
std::cout << "Element at index 3: " << arr[3] << std::endl;  // 输出 4

4.begin() 和 end():返回指向数组开始和结束的迭代器

std::array<int, 5> arr = {1, 2, 3, 4, 5};

for (auto it = arr.begin(); it != arr.end(); ++it) {
    std::cout << *it << " ";  // 输出 1 2 3 4 5
}

5. front() 和 back():返回数组的第一个和最后一个元素

std::array<int, 5> arr = {1, 2, 3, 4, 5};
std::cout << "First element: " << arr.front() << std::endl;  // 输出 1
std::cout << "Last element: " << arr.back() << std::endl;    // 输出 5

6. fill():填充整个数组

std::array<int, 5> arr;
arr.fill(42);  // 所有元素都被设置为 42

7. swap():交换两个 std::array

std::array<int, 3> arr1 = {1, 2, 3};
std::array<int, 3> arr2 = {4, 5, 6};
arr1.swap(arr2);  // 交换 arr1 和 arr2 的内容

for (int i : arr1) {
    std::cout << i << " ";  // 输出 4 5 6
}

8.empty():表示 std::array 是否为空
empty() 函数返回一个布尔值,表示 std::array 是否为空。如果数组的大小为 0,返回 true,否则返回 false。注意,std::array 在声明时是一个固定大小的数组,因此它的大小在编译时就已经确定。即使数组的元素没有被赋值,empty() 仍然根据数组的大小来判断是否为空。

#include <iostream>
#include <array>

int main() {
    // 创建一个固定大小的 std::array
    std::array<int, 5> arr = {1, 2, 3, 4, 5};
    
    // 使用 empty() 检查数组是否为空
    if (arr.empty()) {
        std::cout << "数组是空的!" << std::endl;
    } else {
        std::cout << "数组不为空!" << std::endl;
    }

    // 创建一个空数组
    std::array<int, 0> empty_arr;

    // 使用 empty() 检查空数组
    if (empty_arr.empty()) {
        std::cout << "空数组是空的!" << std::endl;
    } else {
        std::cout << "空数组不为空!" << std::endl;
    }

    return 0;
}

运行结果:
请添加图片描述
说明:

  • 对于 std::array<int, 5>,它的大小是固定的为 5,因此 empty() 会返回 false,即使数组中没有实际赋值的元素。
  • 对于 std::array<int, 0>,大小为 0,empty() 会返回 true。

总结:

  • empty() 判断的是数组的大小是否为零,而不是数组中的元素是否已被初始化或赋值。
  • std::array 的大小在编译时确定,所以它的 empty() 判断只会在大小为零时返回 true。

四、与 C 风格数组的互操作

std::array 提供了 data() 方法,可以返回底层的 C 风格数组指针,这使得它能够与传统的 C 风格数组兼容:

std::array<int, 5> arr = {1, 2, 3, 4, 5};
int* p = arr.data();  // 获取指向数组的指针

// 修改数组元素
p[2] = 100;
for (int val : arr) {
    std::cout << val << " ";  // 输出 1 2 100 4 5
}

http://www.kler.cn/a/523698.html

相关文章:

  • 【Julia】Julia预编译与外部库:从崩溃到完美集成
  • Git进阶之旅:Git 配置信息 Config
  • DeepSeek理解概率的能力
  • 研发的立足之本到底是啥?
  • LTV预估 | 深度学习PLTV之开山鼻祖ZILN
  • Cursor 帮你写一个小程序
  • fpga系列 HDL:XILINX Vivado Vitis 高层次综合(HLS) 实现 EBAZ板LED控制(上)
  • Unity游戏(Assault空对地打击)开发(3) 摄像机跟随
  • 卡通圣诞节404动画页面模板
  • Spring Security(maven项目) 3.0.2.8版本
  • 17.Word:李楠-学术期刊❗【29】
  • C语言中string.h头文件功能介绍
  • Vscode的AI插件 —— Cline
  • Vue Vine:Vue 组件开发的新范式探索
  • spark3.5.4兼容python 3.10.x以下版本
  • 环境搭建--vscode
  • Object类(2)
  • 使用 KNN 搜索和 CLIP 嵌入构建多模态图像检索系统
  • [论文总结] 深度学习在农业领域应用论文笔记14
  • 人工智能:农业领域的变革力量
  • 如何制作浪漫风格的壁纸
  • 【PowerShell专栏】利用PowerShell开启端口的监听
  • GEE | 提取随机样本点的数据,以CHIRPS降水为例
  • Kotlin函数式API
  • 【蓝桥杯嵌入式入门与进阶】2.与开发板之间破冰:初始开发板和原理图2
  • 【Java基础-41.5】深入解析Java异常链:构建清晰的错误追踪体系