You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何存储多个大小不同但元素类型一致的std::array以实现统一遍历?

解决方案

方案1:使用std::span(C++20及以上推荐)

std::span是标准库提供的连续内存视图类型,本身不持有数据,仅记录起始指针和长度,不同大小的std::array<int, N>都可以隐式转换为std::span<int>,开销极低,是该场景的最优选择。
示例代码:

#include <iostream>
#include <array>
#include <span>
#include <vector>

int main() {
    std::array<int, 5> array_one = {1,2,3,4,5};
    std::array<int, 8> array_two = {6,7,8,9,10,11,12,13};
    std::array<int, 2> array_three = {14,15};

    // 直接用span作为容器元素类型,自动适配不同长度的std::array
    std::vector<std::span<int>> array_wrapper = {array_one, array_two, array_three};

    // 遍历所有数组
    for (const auto& arr : array_wrapper) {
        std::cout << "数组长度:" << arr.size() << ",元素:";
        for (int num : arr) {
            std::cout << num << " ";
            // 直接修改arr[i]等价于修改原数组的对应元素
        }
        std::cout << "\n";
    }
    return 0;
}

如果仅需要读取数组元素,可以将元素类型替换为std::span<const int>提升安全性。

方案2:兼容C++11/17的指针+长度实现

如果编译器不支持C++20,可以自己封装简易的视图结构体,或者直接用std::pair<int*, size_t>存储数组的起始指针和长度,效果和span一致:

#include <iostream>
#include <array>
#include <vector>
#include <utility>

int main() {
    std::array<int, 5> array_one = {1,2,3,4,5};
    std::array<int, 8> array_two = {6,7,8,9,10,11,12,13};
    std::array<int, 2> array_three = {14,15};

    std::vector<std::pair<int*, size_t>> array_wrapper = {
        {array_one.data(), array_one.size()},
        {array_two.data(), array_two.size()},
        {array_three.data(), array_three.size()}
    };

    for (const auto& arr_info : array_wrapper) {
        int* data = arr_info.first;
        size_t len = arr_info.second;
        std::cout << "数组长度:" << len << ",元素:";
        for (size_t i = 0; i < len; ++i) {
            std::cout << data[i] << " ";
        }
        std::cout << "\n";
    }
    return 0;
}

方案3:编译期tuple方案(无运行时开销)

如果所有数组在编译期就已经确定,不需要运行时动态增删,可以用std::tuple存储数组引用,搭配折叠表达式遍历,完全没有运行时额外开销:

#include <iostream>
#include <array>
#include <tuple>

int main() {
    std::array<int, 5> array_one = {1,2,3,4,5};
    std::array<int, 8> array_two = {6,7,8,9,10,11,12,13};
    std::array<int, 2> array_three = {14,15};

    // 用tie存引用避免拷贝数组
    auto array_wrapper = std::tie(array_one, array_two, array_three);

    // C++17折叠表达式遍历tuple内的所有数组
    std::apply([](auto&... arrs) {
        (
            [&](){
                std::cout << "数组长度:" << arrs.size() << ",元素:";
                for (int num : arrs) {
                    std::cout << num << " ";
                }
                std::cout << "\n";
            }(),
            ...
        );
    }, array_wrapper);
    return 0;
}

内容的提问来源于stack exchange,提问作者Troganda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:54:03