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
}
相关文章:
C++11中array容器的常见用法
文章目录 一、概述二、std::array的特点三、std::array的定义与初始化三、std::array的常用成员函数四、与 C 风格数组的互操作 一、概述 在 C11 中,std::array 是一个新的容器类型,它提供了一个固定大小的数组封装。相比传统的 C 风格数组,…...
NFTs 是网络艺术,而非数字艺术
传统艺术界对 NFTs 的误解 传统艺术界(包括博物馆、策展人等)常常认为: “我们收藏和策展数字艺术已经数十年了。我们非常了解这个领域。或许少数 NFT 可以被视为优秀的数字艺术,但更多的只是糟糕的数字艺术,甚至根本称…...
澳洲硕士毕业论文写作中如何把握主题
每到毕业季时,澳洲硕士毕业论文写作是留学生学业的头等大事。但是经常有留学生在澳洲毕业论文写作过程中会遇到写了一半,但是不知道应该如何继续下去的问题。有时候是在literature review的部分就越写越觉得偏离了方向,有时候是在数据收集阶段…...
SQL server 数据库使用整理
标题:SQL server 数据库使用整理 1.字符串表名多次查询 2.读取SQL中Json字段中的值:JSON_VALUE(最新版本支持,属性名大小写敏感) 1.字符串表名多次查询 SELECT ROW_NUMBER() OVER (ORDER BY value ASC) rowid,value…...
在Windows系统中本地部署属于自己的大语言模型(Ollama + open-webui + deepseek-r1)
文章目录 1 在Windows系统中安装Ollama,并成功启动;2 非docker方式安装open-webui3下载并部署模型deepseek-r1 Ollama Ollama 是一个命令行工具,用于管理和运行机器学习模型。它简化了模型的下载与部署,支持跨平台使用,…...
nosql mysql的区别
NoSQL 和 MySQL 是两种不同类型的数据库管理系统,它们在设计理念、数据模型、可扩展性和应用场景等方面有着本质的区别。 NoSQL 数据库 特点: 灵活的数据模型: NoSQL 数据库通常没有固定的表结构,可以很容易地存储不同结构的文档或键值对。水平扩展: …...
DeepSeek辅助学术写作摘要内容
学术摘要写作 摘要是文章的精华,通常在200-250词左右。要包括研究的目的、方法、结果和结论。让AI工具作为某领域内资深的研究专家,编写摘要需要言简意赅,直接概括论文的核心,为读者提供快速了解的窗口。 下面我们使用DeepSeek编…...
网络工程师 (5)系统可靠性
前言 系统可靠性是指系统在规定的条件和规定的时间内,完成规定功能的能力。这种能力不仅涵盖了系统本身的稳定性和耐久性,还涉及了系统在面对各种内外部干扰和故障时的恢复能力和容错性。系统可靠性是评价一个系统性能优劣的关键指标之一,对于…...
Swoole的MySQL连接池实现
在Swoole中实现MySQL连接池可以提高数据库连接的复用率,减少频繁创建和销毁连接所带来的开销。以下是一个简单的Swoole MySQL连接池的实现示例: 首先,确保你已经安装了Swoole扩展和PDO_MySQL扩展(或mysqli,但在这个示…...
RoboVLM——通用机器人策略的VLA设计哲学:如何选择骨干网络、如何构建VLA架构、何时添加跨本体数据
前言 本博客内解读不少VLA模型了,包括π0等,且如此文的开头所说 前两天又重点看了下openvla,和cogact,发现 目前cogACT把openvla的动作预测换成了dit,在模型架构层面上,逼近了π0那为了进一步逼近&#…...
Vue.js 配合 Vue Router 使用 Vuex
Vue.js 配合 Vue Router 使用 Vuex 今天我们来聊聊如何将 Vue Router 和 Vuex 结合使用,以实现更高效的状态和路由管理。在大型 Vue.js 应用中,Vue Router 负责路由管理,Vuex 负责状态管理。将两者结合,可以实现如权限控制、动态…...
【Django教程】用户管理系统
Get Started With Django User Management 开始使用Django用户管理 By the end of this tutorial, you’ll understand that: 在本教程结束时,您将了解: Django’s user authentication is a built-in authentication system that comes with pre-conf…...
2024年终总结——今年是蜕变的一年
2024年终总结 摘要前因转折找工作工作的成长人生的意义 摘要 2024我从国企出来,兜兜转转还是去了北京,一边是工资低、感情受挫,一边是压力大、项目经历少,让我一度找不到自己梦寐以求的工作,我投了一家又一家ÿ…...
MySQL--》深度解析InnoDB引擎的存储与事务机制
目录 InnoDB架构 事务原理 MVCC InnoDB架构 从MySQL5.5版本开始默认使用InnoDB存储引擎,它擅长进行事务处理,具有崩溃恢复的特性,在日常开发中使用非常广泛,其逻辑存储结构图如下所示, 下面是InnoDB架构图…...
SpringCloudAlibaba 服务保护 Sentinel 项目集成实践
目录 一、简介1.1、服务保护的基本概念1.1.1、服务限流/熔断1.1.2、服务降级1.1.3、服务的雪崩效应1.1.4、服务的隔离的机制 1.2、Sentinel的主要特性1.3、Sentinel整体架构1.4、Sentinel 与 Hystrix 对比 二、Sentinel控制台部署3.1、版本选择和适配3.2、本文使用各组件版本3.…...
c++面试:类定义为什么可以放到头文件中
这个问题是刚了解预编译的时候产生的疑惑。 声明是指向编译器告知某个变量、函数或类的存在及其类型,但并不分配实际的存储空间。声明的主要目的是让编译器知道如何解析程序中的符号引用。定义不仅告诉编译器实体的存在,还会为该实体分配存储空间&#…...
DeepSeek理解概率的能力
问题: 下一个问题是概率问题。乘车时有一个人带刀子的概率是百分之一,两个人同时带刀子的概率是万分之一。有人认为如果他乘车时带上刀子,那么还有其他人带刀子的概率就是万分之一,他乘车就会安全得多。他的想法对吗?…...
STM32 GPIO配置 点亮LED灯
本次是基于STM32F407ZET6做一个GPIO配置,实现点灯实验。 新建文件 LED.c、LED.h文件,将其封装到Driver文件中。 双击Driver文件将LED.c添加进来 编写头文件,这里注意需要将Driver头文件声明一下。 在LED.c、main.c里面引入头文件LED.h LED初…...
模板泛化类如何卸载释放内存
CustomWidget::~CustomWidget() {for (size_t i 0; i < buttonManager.registerItem.size(); i) {delete buttonManager.registerItem(exitButton);} } 以上该怎么写删除对象操作,类如下:template <typename T> class GenericManager { public…...
MFC结构体数据文件读写实例
程序功能将结构体内数组数据写入文件和读出 2Dlg.h中代码: typedef struct Student {int nNum[1000];float fScore;CString sss;}stu; class CMy2Dlg : public CDialog { // Construction public:CMy2Dlg(CWnd* pParent NULL); // standard constructorstu stu1; ... } 2Dl…...
jemalloc 5.3.0的tsd模块的源码分析
一、背景 在主流的内存库里,jemalloc作为android 5.0-android 10.0的默认分配器肯定占用了非常重要的一席之地。jemalloc的低版本和高版本之间的差异特别大,低版本的诸多网上整理的总结,无论是在概念上和还是在结构体命名上在新版本中很多都…...
03-机器学习-数据获取
一、流行机器学习数据集 主流机器学习数据集汇总 数据集名称描述来源MNIST手写数字图像数据集,由美国人口普查局员工书写。MNIST官网ImageNet包含数百万张图像,用于图像分类和目标检测。ImageNet官网AudioSet包含YouTube音频片段,用于声音分…...
编程题-最长的回文子串(中等)
题目: 给你一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2: 输入:s &…...
爱书爱考平台说明
最近我开发了一个综合性的考试平台,内容包括但不限于职业资格证考试、成人教育、国家公务员考试等内容。目前1.0版本已经开发完成,其他的功能陆续完善中。 微信小程序搜索"爱书爱考" 微信小程序图标如下图: 目前维护了java相关的面试题的考题…...
doris: MAP数据类型
MAP<K, V> 表示由K, V类型元素组成的 map,不能作为 key 列使用。 目前支持在 Duplicate,Unique 模型的表中使用。 K, V 支持的类型有: BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, DECIMALV3, DAT…...
JUC--ConcurrentHashMap底层原理
ConcurrentHashMap底层原理 ConcurrentHashMapJDK1.7底层结构线程安全底层具体实现 JDK1.8底层结构线程安全底层具体实现 总结JDK 1.7 和 JDK 1.8实现有什么不同?ConcurrentHashMap 中的 CAS 应用 ConcurrentHashMap ConcurrentHashMap 是一种线程安全的高效Map集合…...
Sklearn 中的逻辑回归
逻辑回归的数学模型 基本模型 逻辑回归主要用于处理二分类问题。二分类问题对于模型的输出包含 0 和 1,是一个不连续的值。分类问题的结果一般不能由线性函数求出。这里就需要一个特别的函数来求解,这里引入一个新的函数 Sigmoid 函数,也成…...
Spring Boot 自定义属性
Spring Boot 自定义属性 在 Spring Boot 应用程序中,application.yml 是一个常用的配置文件格式。它允许我们以层次化的方式组织配置信息,并且比传统的 .properties 文件更加直观。 本文将介绍如何在 Spring Boot 中读取和使用 application.yml 中的配…...
1.2第1章DC/DC变换器的动态建模-1.2Buck-Boost 变换器的交流模型--电力电子系统建模及控制 (徐德鸿)--读书笔记
1.2 Buck-Boost 变换器的交流模型 Buck- Boost变换器是一种典型的DC/DC变换器,具有升压和降压功能其输出电压的极性与输入电压相反,见图1-4a。当电感L的电流i(t)连续时一个开关周期可以分为两个阶段。在阶段1,开关在位置1时,即&am…...
数据结构:二叉树—面试题(一)
目录 1、相同的树 2、另一棵树的子树 3、翻转二叉树 4、平衡二叉树 5、对称二叉树 6、二叉树遍历 7、二叉树的分层遍历 1、相同的树 习题链接https://leetcode.cn/problems/same-tree/description/ 描述: 给你两棵二叉树的根节点 p 和 q ,编写一…...
