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::arraystd::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::arraystd::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.mzph.cn/web/67355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 响应式渲染 - 待办事项简单实现

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 响应式渲染 - 待办事项简单实现 目录 待办事项简单实现 页面初始化 双向绑定的指令 增加留言列表设置 增加删除按钮 最后优化 总结 待办事项简单实现 页面初始化 对页面进行vue的引入、创建输入框和按钮及实例化V…

中文输入法方案

使用了三年的自然码双拼&#xff0c;毫无疑问是推荐使用双拼输入法。 三年积累下来的习惯是&#xff1a; 1 自然码方案 2 空格出字 字母选字 直到如今&#xff0c;想要做出改变&#xff0c;是因为这样的方案带来的痛点&#xff1a; 1 使用空格出字就无法使用辅助码&#…

在Windows系统中本地部署属于自己的大语言模型(Ollama + open-webui + deepseek-r1)

文章目录 1 在Windows系统中安装Ollama&#xff0c;并成功启动&#xff1b;2 非docker方式安装open-webui3下载并部署模型deepseek-r1 Ollama Ollama 是一个命令行工具&#xff0c;用于管理和运行机器学习模型。它简化了模型的下载与部署&#xff0c;支持跨平台使用&#xff0c…

ProGen生成功能蛋白序列

LLM在包括蛋白质设计等各种生物技术应用中展现出了潜力。ProGen是一种语言模型&#xff0c;它能够生成在大型蛋白质家族中具有可预测功能的蛋白质序列&#xff0c;这类似于针对不同主题生成语法和语义正确的自然语言句子。该模型在来自超过19,000个家族的2.8亿个蛋白质序列上进…

省级数字经济发展水平数据(2011-2022年)-社科数据

省级数字经济发展水平数据&#xff08;2011-2022年&#xff09;-社科数据https://download.csdn.net/download/paofuluolijiang/90028602 https://download.csdn.net/download/paofuluolijiang/90028602 数字经济是指以数据资源为关键要素、以现代信息网络为主要载体、以信息…

Leecode刷题C语言之跳跃游戏②

执行结果:通过 执行用时和内存消耗如下&#xff1a; int jump(int* nums, int numsSize) {int position numsSize - 1;int steps 0;while (position > 0) {for (int i 0; i < position; i) {if (i nums[i] > position) {position i;steps;break;}}}return steps…

《多线程基础之条件变量》

【条件变量导读】条件变量是多线程中比较灵活而且容易出错的线程同步手段&#xff0c;比如&#xff1a;虚假唤醒、为啥条件变量要和互斥锁结合使用&#xff1f;windows和linux双平台下&#xff0c;初始化、等待条件变量的api一样吗&#xff1f; 本文将分别为您介绍条件变量在w…

消息队列篇--通信协议篇--TCP和UDP(3次握手和4次挥手,与Socket和webSocket的概念区别等)

1、TCP和UDP概述 TCP&#xff08;传输控制协议&#xff0c;Transmission Control Protocol&#xff09;和UDP&#xff08;用户数据报协议&#xff0c;User Datagram Protocol&#xff09;都算是最底层的通信协议&#xff0c;它们位于OSI模型的传输层。*传输层的主要职责是确保…

打破传统束缚:领略 Web3 独特魅力

在互联网发展的历程中&#xff0c;我们见证了Web1和Web2的变迁。Web1是静态信息的展示平台&#xff0c;Web2则引领了社交互动和内容创作的繁荣&#xff0c;而如今&#xff0c;Web3作为新时代的互联网架构&#xff0c;正逐渐展现出其独特的魅力&#xff0c;带领我们走向一个更加…

[论文总结] 深度学习在农业领域应用论文笔记14

当下&#xff0c;深度学习在农业领域的研究热度持续攀升&#xff0c;相关论文发表量呈现出迅猛增长的态势。但繁荣背后&#xff0c;质量却不尽人意。相当一部分论文内容空洞无物&#xff0c;缺乏能够落地转化的实际价值&#xff0c;“凑数” 的痕迹十分明显。在农业信息化领域的…

Linux 学习笔记__Day3

十八、设置虚拟机的静态IP 1、VMware的三种网络模式 安装VMware Workstation Pro之后&#xff0c;会在Windows系统中虚拟出两个虚拟网卡&#xff0c;如下&#xff1a; VMware提供了三种网络模式&#xff0c;分别是&#xff1a;桥接模式&#xff08;Bridged&#xff09;、NAT…

QT+mysql+python 效果:

# This Python file uses the following encoding: utf-8 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QMessageBox from PySide6.QtGui import QStandardItemModel, QStandardItem # 导入需要的类# Important: # 你需要通过以下指令把 form.ui转为ui…

笔记本跑大模型尝试

1&#xff0c;笔记本电脑资源 我是一台联想笔记本电脑&#xff0c;基本配置如下&#xff1a; CPU&#xff1a;12th Gen Intel(R) Core(TM) i7-1255U 1.70 GHz (12核心&#xff0c;2个P核和8个E核&#xff0c;共计10个核心) 显卡&#xff1a;NVIDIA GeForce MX550 内存&am…

C语言实现扫雷游戏(有展开一片和标记雷的功能)

实现准备 分2个.c源文件和1个.h头文件去写代码 test.c 对扫雷游戏进行测试game.c 扫雷游戏功能的实现game.h 扫雷游戏功能的声明 扫雷游戏 1.test.c对扫雷游戏进行测试 首先我们要先把玩游戏的框架写出来&#xff0c;然后一步一步去完成其功能 跟着下面的代码的节奏走一步一步…

基础IO(2)

基础IO&#xff08;2&#xff09; 理解“⼀切皆⽂件” ⾸先&#xff0c;在windows中是⽂件的东西&#xff0c;它们在linux中也是⽂件&#xff1b;其次⼀些在windows中不是⽂件的东西&#xff0c;⽐如进程、磁盘、显⽰器、键盘这样硬件设备也被抽象成了⽂件&#xff0c;你可以使…

Transformation,Animation and Viewing

4 Transformation&#xff0c;Animation and Viewing 声明&#xff1a;该代码来自&#xff1a;Computer Graphics Through OpenGL From Theory to Experiments&#xff0c;仅用作学习参考 4.1 Modeling Transformations 平移、缩放和旋转&#xff0c;即 OpenGL 的建模转换&…

Deepseek的RL算法GRPO解读

在本文中&#xff0c;我们将深入探讨Deepseek采用的策略优化方法GRPO&#xff0c;并顺带介绍一些强化学习&#xff08;Reinforcement Learning, RL&#xff09;的基础知识&#xff0c;包括PPO等关键概念。 策略函数&#xff08;policy&#xff09; 在强化学习中&#xff0c; a…

【python】python基于机器学习与数据分析的二手手机特性关联与分类预测(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 python基于机器学习与数据分析的二手手机特性关联与…

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09; 目录 手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09;Stable Diffusion 原理图Stable Diffusion的原理解释Stable Diffusion 和Di…

前端【8】HTML+CSS+javascript实战项目----实现一个简单的待办事项列表 (To-Do List)

目录 一、功能需求 二、 HTML 三、CSS 四、js 1、绑定事件与初始设置 2.、绑定事项 &#xff08;1&#xff09;添加操作&#xff1a; &#xff08;2&#xff09;完成操作 &#xff08;3&#xff09;删除操作 &#xff08;4&#xff09;修改操作 3、完整js代码 总结…