一篇完全搞懂C++ STL std::array
@TOC
完全搞懂 C++ STL std::array
前言
C++ 标准模板库(STL)提供了丰富的容器类,旨在简化数据处理。其中,std::array
是一个封装固定大小数组的容器类,引入于 C++11。与动态大小的 std::vector
相比,std::array
在性能和使用场景上有所不同。本文将详细介绍 std::array
的构造函数、成员函数、与 std::vector
的区别和相同点,并提供示例代码以演示如何使用 std::array
。
std::array
概述
std::array
是一个模板类,封装了固定大小的数组。它提供了类似于原始数组的性能,但增加了许多 STL 容器的功能特性,如成员函数和迭代器支持。
std::array
的构造函数
std::array
提供了多种构造函数来初始化数组:
-
默认构造函数
函数原型:
constexpr array() noexcept;
作用:创建一个大小为 0 的空
std::array
(只适用于std::array<void, 0>
)。返回值:无返回值。
-
初始化列表构造函数
函数原型:
constexpr array(std::initializer_list<T> ilist);
示例:std::array<int, 5> arr = {1, 2, 3, 4, 5};
作用:使用初始化列表初始化 std::array
。
参数:
ilist
:用于初始化数组的列表。
返回值:无返回值。
-
拷贝构造函数
函数原型:
constexpr array(const array& other) noexcept;
作用:使用另一个
std::array
对象初始化新对象。参数:
other
:另一个std::array
对象。
返回值:无返回值。
-
移动构造函数
函数原型:
constexpr array(array&& other) noexcept;
作用:使用另一个
std::array
对象的资源初始化新对象,并将原对象置于有效但未指定的状态。参数:
other
:另一个std::array
对象(右值)。
返回值:无返回值。
std::array
的成员函数
1. std::array::at
函数原型:
reference at(size_type pos);
const_reference at(size_type pos) const;
作用:返回指定位置的元素。如果位置超出范围,会抛出 std::out_of_range
异常。
参数:
pos
:要访问的元素的索引位置。
返回值:指定位置的元素的引用或常量引用。
2. std::array::operator[]
函数原型:
reference operator[](size_type pos);
const_reference operator[](size_type pos) const;
作用:返回指定位置的元素。不会进行越界检查。
参数:
pos
:要访问的元素的索引位置。
返回值:指定位置的元素的引用或常量引用。
3. std::array::front
函数原型:
reference front();
const_reference front() const;
作用:返回容器中第一个元素。
返回值:容器中第一个元素的引用或常量引用。
4. std::array::back
函数原型:
reference back();
const_reference back() const;
作用:返回容器中最后一个元素。
返回值:容器中最后一个元素的引用或常量引用。
5. std::array::data
函数原型:
pointer data() noexcept;
const_pointer data() const noexcept;
作用:返回指向数组中第一个元素的指针。
返回值:指向容器内存的指针。
6. std::array::size
函数原型:
constexpr size_type size() const noexcept;
作用:返回容器中元素的数量。
返回值:元素的数量。
7. std::array::fill
函数原型:
void fill(const T& value);
作用:将容器中所有元素设置为指定值。
参数:
value
:要设置的值。
8. std::array::swap
函数原型:
void swap(array& other) noexcept;
作用:交换当前容器和另一个 std::array
容器的内容。
参数:
other
:要交换的另一个std::array
容器。
std::array 的长度调整
std::array 的长度在创建时是固定的,不能在运行时调整。这意味着你不能增加或减少 std::array 的大小。对于需要动态调整大小的场景,应该使用 std::vector,它提供了动态调整容器大小的功能。
迭代器支持
std::array
提供了标准的迭代器接口,支持各种 STL 算法。
-
std::array::begin
函数原型:
iterator begin() noexcept; const_iterator begin() const noexcept;
作用:返回指向容器第一个元素的迭代器。
返回值:指向容器第一个元素的迭代器或常量迭代器。
-
std::array::end
函数原型:
iterator end() noexcept; const_iterator end() const noexcept;
作用:返回指向容器最后一个元素之后的迭代器。
返回值:指向容器最后一个元素之后的迭代器或常量迭代器。
-
std::array::cbegin
函数原型:
const_iterator cbegin() const noexcept;
作用:返回指向容器第一个元素的常量迭代器。
返回值:指向容器第一个元素的常量迭代器。
-
std::array::cend
函数原型:
const_iterator cend() const noexcept;
作用:返回指向容器最后一个元素之后的常量迭代器。
返回值:指向容器最后一个元素之后的常量迭代器。
示例代码
以下是一个完整的示例代码,展示了如何使用 std::array
的各种成员函数和迭代器:
#include <iostream>
#include <array>
#include <algorithm>
int main() {
// 创建一个 std::array
std::array<int, 5> arr = {1, 2, 3, 4, 5};
// 使用 at() 访问元素
std::cout << "Element at index 2: " << arr.at(2) << std::endl;
// 使用 operator[] 访问元素
std::cout << "Element at index 2 (using operator[]): " << arr[2] << std::endl;
// 修改元素
arr[2] = 10;
// 使用 front() 和 back()
std::cout << "First element: " << arr.front() << std::endl;
std::cout << "Last element: " << arr.back() << std::endl;
// 使用 data()
int* p = arr.data();
std::cout << "First element (via data()): " << *p << std::endl;
// 使用 fill()
arr.fill(7);
std::cout << "All elements after fill(7): ";
for (const auto& elem : arr) {
std::cout << elem << " ";
}
std::cout << std::endl;
// 使用 swap()
std::array<int, 5> another_arr = {5, 4, 3, 2, 1};
arr.swap(another_arr);
std::cout << "arr after swap: ";
for (const auto& elem : arr) {
std::cout << elem << " ";
}
std::cout << std::endl;
std::cout << "another_arr after swap: ";
for (const auto& elem : another_arr) {
std::cout << elem << " ";
}
std::cout << std::endl;
// 使用迭代器
std::cout << "Elements using iterators: ";
for (auto it = arr.begin(); it != arr.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
总结
std::array
是 C++11 引入的一个固定大小数组容器,它结合了固定大小数组的性能优势和 STL 容器的便利特性。std::array
提供了多种构造函数、成员函数和标准迭代器支持,使得它
在固定大小的场景下非常高效。与 std::vector
相比,std::array
更适用于大小在编译时确定的情况,而 std::vector
则适合需要动态调整大小的情况。理解这些特性和用例可以帮助你在编程中做出更合适的数据结构选择。
- 点赞
- 收藏
- 关注作者
评论(0)