C++任意维度嵌套向量的元素遍历与赋值可行性问询
实现任意层数嵌套std::vector的遍历函数(深度优先)
在C++中完全可以实现这种支持任意层数嵌套vector的遍历函数,核心思路是利用模板特化区分「普通元素类型」和「vector容器类型」,通过递归调用完成深度优先遍历。
实现方案
我们可以定义两个模板函数配合工作:
- 基础模板:处理非vector的普通类型,执行具体业务操作(比如示例中的赋值为0)。
- 特化模板:处理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
相关产品推荐
相关产品推荐

