C++中是否存在更简洁的定长多维vector声明方式?
C++简化指定大小多维vector声明的实现方法
原生嵌套声明写法需要重复书写多层vector模板参数,确实冗余,可以通过以下几种方式大幅简化代码:
1. 自定义通用多维vector生成模板(通用性最强)
通过可变参数模板递归构造任意维度的vector,一次编写后所有维度场景都可以直接调用,不需要重复写嵌套类型,C++14及以上版本可直接使用:
#include <vector> // 递归终止:构造一维vector template<typename T> std::vector<T> make_vector(std::size_t size, const T& init_val = T{}) { return std::vector<T>(size, init_val); } // 递归构造高维vector template<typename T, typename... DimArgs> auto make_vector(std::size_t first_dim, DimArgs... rest_dims, const T& init_val = T{}) { return std::vector(first_dim, make_vector<T>(rest_dims..., init_val)); }
使用方式非常简洁,不管多少维只需要按顺序传入各维度大小、初始值即可:
int a = 3, b = 4, c = 5; // 3维vector,各维度大小a/b/c,初始值为0 auto vec = make_vector<int>(a, b, c, 0); // 不需要自定义初始值时可以省略最后一个参数,int会默认初始化为0 // auto vec = make_vector<int>(a, b, c);
2. C++17及以上版本利用类模板参数推导(CTAD)简化
C++17支持类模板参数推导,不需要手写每层vector的模板参数,编译器会自动根据构造参数推导类型,原来的冗长写法可以简化为:
int a = 3, b = 4, c = 5; std::vector vec(a, std::vector(b, std::vector(c, 0)));
这种写法不需要额外定义工具函数,但维度较高时仍然需要嵌套写多层std::vector构造,灵活性不如自定义模板方案。
3. 类型别名简化固定场景的声明
如果你经常使用某一固定维度、固定元素类型的vector,可以提前用using定义类型别名,减少重复书写类型的成本:
// 提前定义3维int vector的类型别名 using Int3DVector = std::vector<std::vector<std::vector<int>>>; int a = 3, b = 4, c = 5; Int3DVector vec(a, std::vector<std::vector<int>>(b, std::vector<int>(c, 0)));
这种方案仅适用于维度、元素类型固定的场景,通用性较差。
性能提示:多层嵌套的
std::vector每一层内存独立分配,缓存命中率低,如果对访问性能要求较高,建议用一维vector模拟多维存储,通过下标计算访问元素,内存连续性更好。
内容的提问来源于stack exchange,提问作者Dustin Miao
相关产品推荐
相关产品推荐

