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}; }