《C++ array类》

1. 基本概念与特性

固定大小:std::array 的大小在编译时确定,无法动态调整(与 std::vector 不同)。

栈分配:内存分配在栈上(除非作为类成员或通过动态分配),访问速度快。(当然也可以直接定义成全局变量)

与原生数组的对比:

  • 支持迭代器、范围循环、STL 算法等。
  • 提供边界检查(如 at() 方法)。
  • 直接支持拷贝、赋值等操作。

2. 函数调用

(1) 声明与初始化

#include <array>
#include <iostream>

int main() {
    std::array<int, 3> arr1;          // 默认初始化(值未定义)
    std::array<int, 3> arr2 = {1, 2, 3}; // 列表初始化
    std::array<int, 3> arr3{4, 5, 6};  // C++11 统一初始化
    std::array<std::string, 2> arr4 = {"hello", "world"}; // 支持自定义类型

    // 访问元素
    std::cout << arr2[1] << std::endl; // 无边界检查(原生数组行为)
    std::cout << arr2.at(1) << std::endl; // 带边界检查(抛出 std::out_of_range)
}

 

(2) 迭代器支持

std::array<int, 4> arr = {10, 20, 30, 40};

// 使用迭代器遍历
for (auto it = arr.begin(); it != arr.end(); ++it) {
    std::cout << *it << " ";
}

// 范围循环(C++11)
for (const auto& elem : arr) {
    std::cout << elem << " ";
}

 

(3) 常用成员函数

size()    返回元素数量(编译时常量)    arr.size()
empty()    判断是否为空    arr.empty()
front()    访问第一个元素    arr.front()
back()    访问最后一个元素    arr.back()
data()    获取指向底层数组的指针    int* p = arr.data();
fill(val)    将所有元素设为 val    arr.fill(0);
swap(other)    与另一个 array 交换内容    arr1.swap(arr2);

 

(4) 赋值操作

单个元素赋值:

std::array<int, 3> arr;
arr[0] = 10; // 通过下标赋值
arr.at(1) = 20; // 通过 at() 方法赋值(会检查边界)
arr.back() = 30; // 修改最后一个元素

与数组赋值:

std::array<int, 3> arr1 = {1, 2, 3};
std::array<int, 3> arr2;

// 使用 operator= 复制
arr2 = arr1;

// 或通过 std::copy(需包含 <algorithm>)
std::array<int, 3> arr3;
std::copy(arr1.begin(), arr1.end(), arr3.begin());

与C风格数组赋值:

int c_array[] = {7, 8, 9};       // C 风格数组
std::array<int, 3> arr;          // std::array 容器

// 通过 std::copy 复制
std::copy(std::begin(c_array), std::end(c_array), arr.begin());



扩展:将array数组赋值给C风格数组
// 将 std::array 的数据复制到 C 风格数组
std::copy(arr.begin(), arr.end(), std::begin(c_array));

 

3. 与 STL 算法结合

#include <algorithm>
#include <numeric>

std::array<int, 5> arr = {3, 1, 4, 1, 5};

// 排序
std::sort(arr.begin(), arr.end()); // 结果:{1, 1, 3, 4, 5}

// 求和
int sum = std::accumulate(arr.begin(), arr.end(), 0); // 结果:14

// 查找
auto it = std::find(arr.begin(), arr.end(), 3);
if (it != arr.end()) {
    std::cout << "Found at index: " << std::distance(arr.begin(), it);
}

 

4. 与原生数组的互操作

  隐式转换:std::array 可以隐式转换为原生数组指针(通过 data() 或 &arr[0])。

void printArray(const int* arr, size_t size) {
    for (size_t i = 0; i < size; ++i) {
        std::cout << arr[i] << " ";
    }
}

int main() {
    std::array<int, 3> myArr = {1, 2, 3};
    printArray(myArr.data(), myArr.size()); // 传递指针和大小
}

 

posted @ 2025-08-30 17:24  一个不知道干嘛的小萌新  阅读(2)  评论(0)    收藏  举报