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

C++任意维度嵌套向量的元素遍历与赋值可行性问询

实现任意层数嵌套std::vector的遍历函数(深度优先)

在C++中完全可以实现这种支持任意层数嵌套vector的遍历函数,核心思路是利用模板特化区分「普通元素类型」和「vector容器类型」,通过递归调用完成深度优先遍历。

实现方案

我们可以定义两个模板函数配合工作:

  1. 基础模板:处理非vector的普通类型,执行具体业务操作(比如示例中的赋值为0)。
  2. 特化模板:处理vector类型,遍历容器内的每个元素,递归调用自身继续拆解嵌套结构。

示例代码

#include <vector>

// 基础模板:处理普通类型(非vector)
template <typename T>
void scan(T& elem) {
    elem = static_cast<T>(0); // 示例操作:将元素赋值为0
}

// 特化模板:处理vector类型,递归遍历嵌套结构
template <typename T>
void scan(std::vector<T>& vec) {
    for (auto& elem : vec) {
        scan(elem); // 深度优先:先递归处理每个子元素,直到触达最内层普通类型
    }
}

代码说明

  • 当传入最内层的普通元素(比如int、double)时,会匹配基础模板,直接执行赋值操作。
  • 当传入任意层数的vector(比如std::vector<int>、std::vector<std::vector<int>>、std::vector<std::vector<std::vector<double>>>等),会匹配特化模板,遍历容器中的每个元素并递归调用scan,直到所有嵌套层级都被处理完毕。

测试示例

#include <iostream>

int main() {
    std::vector<std::vector<std::vector<int>>> nested_vec = {
        {{1,2}, {3,4}},
        {{5,6}, {7,8}}
    };

    scan(nested_vec);

    // 输出验证:所有元素已被赋值为0
    for (const auto& layer1 : nested_vec) {
        for (const auto& layer2 : layer1) {
            for (int num : layer2) {
                std::cout << num << " ";
            }
            std::cout << std::endl;
        }
        std::cout << std::endl;
    }
    return 0;
}

扩展优化

如果需要适配不同的处理逻辑(比如不是固定赋值为0),可以将操作逻辑封装成函数对象作为参数传入,让函数更灵活:

template <typename T, typename Func>
void scan(T& elem, Func func) {
    func(elem);
}

template <typename T, typename Func>
void scan(std::vector<T>& vec, Func func) {
    for (auto& elem : vec) {
        scan(elem, func);
    }
}

// 使用示例:
// scan(nested_vec, [](auto& x){ x = 0; }); // 赋值为0
// scan(nested_vec, [](auto& x){ std::cout << x << " "; }); // 打印元素

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:15:04