n维向量

13

假设我想声明一个向量,其中包含一个向量,其包含一个向量,一直到 n 维。

像这样:

using namespace std;
// for n=2
vector<vector<int> > v2;
// for n=3
vector<vector<vector<int> > > v3;
// for n=4
vector<vector<vector<vector<int> > > > v3;

是否有一种使用模板元编程的方法来处理任意 n 的问题?


1
Boost.MultiArray - Benjamin Lindley
1个回答

21

是的,这很简单。

就像归纳证明一样,我们设置一个递归情况和一个(部分特化的)基本情况来结束递归。

template<size_t dimcount, typename T>
struct multidimensional_vector
{
    typedef std::vector< typename multidimensional_vector<dimcount-1, T>::type > type;
};

template<typename T>
struct multidimensional_vector<0,T>
{
    typedef T type;
};

multidimensional_vector<1, int>::type v;
multidimensional_vector<2, int>::type v2;
multidimensional_vector<3, int>::type v3;
multidimensional_vector<4, int>::type v4;

我建议使用可变模板参数而不是只使用一个 T,以便允许传递其他内容到 std::vector(它接受额外的默认参数)。 - bitmask
@bitmask:没有使用可变参数的理由,只需要为Allocator提供一个类型参数即可,该参数应该与std::vector本身具有相同的默认值。但在罕见情况下,如果需要非标准分配器,则可能适用于此类的所有用法,在这种情况下,它可以直接放入递归typedef行中。 - Ben Voigt
是的,但你必须手动指定,对吧?看起来很麻烦。 - bitmask
1
@JonDeaton:C++是静态类型的。 - Ben Voigt
@BenVoigt 我知道...在这个例子中,维度计数是静态的(即必须在编译时知道才能用作模板参数)。如果您尝试在此示例中使用动态值作为维度数,则会收到编译器错误。我想知道是否有一个N维数组的建议,其中N不是constexpr - Jon Deaton
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接