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++标准模板库(STL)array固定容器