C++标准模板库(STL)array固定容器
一. 定义与基本概念
在C++中,array是一个固定大小的容器,位于<array>头文件中。它与传统的C - style数组相比,具有更多面向对象的特性,同时又保留了数组在内存中连续存储的优点,能够提供高效的随机访问。
例如,定义一个array对象:std::array<int, 5> arr;,这里定义了一个名为arr的array对象,它可以存储5个int类型的元素。
二. 初始化
默认初始化:当定义一个array对象时,如果没有提供初始化值,它会进行默认初始化。对于基本类型(如int),其元素会被初始化为相应类型的默认值(例如,int类型的默认值为0)。例如,std::array<int, 5> arr;会创建一个包含5个元素且每个元素都为0的array对象。
列表初始化:可以使用花括号来进行列表初始化。例如,std::array<int, 3> arr = {1, 2, 3};,这里将arr的三个元素分别初始化为1、2和3。如果提供的初始化值数量小于array的大小,剩余的元素会进行默认初始化;如果提供的初始化值数量大于array的大小,则会导致编译错误。
三. 元素访问
使用[]运算符:与传统数组一样,可以使用[]运算符来访问array对象中的元素。例如,std::array<int, 5> arr = {1, 2, 3, 4, 5};,那么arr[2]表示访问arr中的第三个元素,其值为3。需要注意的是,与vector不同,array不提供边界检查,使用[]运算符访问超出范围的元素会导致未定义行为。
使用at()方法:array也提供了at()方法来访问元素,它会进行边界检查。例如,std::array<int, 5> arr = {1, 2, 3, 4, 5};,arr.at(4)可以安全地访问arr中的第五个元素,如果使用arr.at(5)(超出范围),则会抛出std::out_of_range异常。
四. 大小与迭代
获取大小:可以使用size()方法来获取array对象的大小。例如,std::array<int, 5> arr;,arr.size()会返回5,表示arr中元素的个数。
迭代:可以使用迭代器来遍历array对象。
#include <array> #include <iostream> int main() { std::array<int, 5> arr = {1, 2, 3, 4, 5}; for (auto it = arr.begin(); it!= arr.end(); ++it) { std::cout << *it << " "; } return 0; }
这里使用begin()和end()方法获取array的起始和结束迭代器,然后通过迭代器遍历并输出每个元素的值。
五. 与其他容器的比较
1. 与vector的比较
(1). 大小固定性:array是固定大小的容器,一旦定义其大小就不能改变;而vector是动态大小的容器,可以根据需要动态地增加或减少元素个数。
(2). 内存布局:两者中的元素在内存中都是连续存储的,都支持高效的随机访问。但是,由于array大小固定,它在某些情况下可能具有更好的性能和更低的内存开销(例如,不需要为动态调整大小而预留额外的内存空间)。
2. 与C - style数组的比较
(1). 安全性:array提供了一些安全特性,如at()方法的边界检查,而C - style数组没有这些特性,访问C - style数组越界会导致未定义行为。
(2). 面向对象特性:array是一个类类型,具有成员函数等面向对象的特性,如size()方法,而C - style数组只是一块连续的内存空间,没有这些额外的功能。
六. 作为函数参数和返回值
(1). 作为函数参数:array对象可以方便地作为函数参数传递。由于其大小是固定的并且是模板类型的一部分,在函数模板中可以精确地处理不同大小和类型的array对象。
void printArray(std::array<int, 5>& arr) { for (auto num : arr) { std::cout << num << " "; } std::cout << std::endl; }
(2). 作为函数返回值:array对象也可以作为函数的返回值。
std::array<int, 3> getArray() { return {1, 2, 3}; }
C++编程语言基础
- C++:从入门到工作的教程
- 这是我的第一个 C++程序!
- C++中main函数有什么作用?
- C++中 #include 指令的作用
- C++中常用的预处理指令
- C++中 iostream 头文件定义了什么
- C++名称空间(namespace)
- C++标准库中 std 命名空间定义了些什么
- C++常用的头文件
- C++源代码的发布方式
- C++变量名的定义、变量的作用、使用规范
- C++的关键字列表
- C++数据类型:整型(整数类型)
- 二进制补码、原码、反码
- C++数据类型:char字符型(整数类型)
- ASCII码表及C++字符函数库(cctype)
- 计算机汉字编码
- C++数据类型:bool类型(整数类型)
- C++中 const 限定符
- C++数据类型:浮点数
- C++运算符:算术运算符
- C++运算符:类型转换规则
- 计算机数据存储大小端模式
- C++运算符:位运算 与 bitset类库
- C++运算符:关系运算符与逻辑运算符
- C++流程控制:顺序、选择、循环、跳转语句
- C++函数的定义、参数传递、重载、嵌套
- C++数组:一维、二维、多维数组的运用
- C-style字符串、库函数 与 std::string对象
- C++数据类型:结构体(struct)
- C++数据类型:联合体(union)
- C++数据类型:枚举(enum)
- C++数据类型别名:typedef
- C++指针
- C++内存操作符:new分配 与 delete释放
- C++标准模板库(STL)容器、算法、迭代器
- C++标准模板库(STL)vector顺序容器
- C++标准模板库(STL)array固定容器
- C++标准模板库(STL)list双向链表容器
- C++标准模板库(STL)deque双端队列
- C++标准模板库(STL)集合 set 关联容器
- C++标准模板库(STL)map关联容器
- C++标准模板库(STL)unordered_set
- C++标准模板库(STL)unordered_map
- C++标准模板库(STL)algorithm算法库
- C++文件操作
- C++数学库(cmath)数学常量与数学函数
- C++模板:函数模板、类模板
- C++与SQLite3联合打造实用的应用程序
- C++实战开发中常用的库(概述)
- 第二部分:C++面向对象编程
- C++:类的定义与声明、类对象应用
- 第三部分:数据结构与算法(概述)
- 第一部分:C++语言简介与学习路线