在C++中创建可变数量的向量

3
我可以通过以下方式创建一个大小为n*m的二维数组: vector< vector< int > > foo(n, vector< int > (m))
假设在运行时我会得到变量数量不确定的值,例如v_1, v_2, v_3, ..., v_k,并且想要创建以下内容: vector< vector< ... vector< int > ... > > foo(v_1, vector< ... > (v_2, vector< ... > ..)); 换句话说,创建一个大小为v_1* v_2 * v_3 ... *v_k的多维数组。我该如何做?这可能吗?

据我所知,没有办法做到你所寻求的。因为嵌套深度必须在编译期间确定。但是这似乎是一个 XY 问题。你的问题是 X,你认为 Y 是解决方案,所以你问的是关于 Y 而不是关于 X 的问题。 - StoryTeller - Unslander Monica
@StoryTeller 这是真的,但我找到了另一种解决X的方法。只是想看看是否也可以使用Y来解决它。 - insumity
我误读了原始问题 - 是的,我认为没有(简单)的方法来做到这一点。下面Tony D的解决方案是我要建议的 - 但很快就变得非常笨拙和复杂。 - Mats Petersson
1
好的,谢谢你提出这个有趣的问题,我给你点赞! - StoryTeller - Unslander Monica
3
每个vector<...>都是一种类型. 你所要求的在编译时使用可变参数模板几乎是微不足道的(例如,MyData<int,10,20,30>实际上会产生一个三层嵌套的向量的向量的向量)。 对于运行时使用可变参数构造函数会稍微复杂一些(例如,MyData<int>(10,20,30))。但是,要以变量列表作为参数列表在运行时完成所有操作将是非常困难的(但如果有足够的工作量仍然可行)。它不会像vector<vector<vector...>>>这样的微不足道格式。 - WhozCraig
2个回答

4
你需要使用boost::variant,它可以处理这个问题。你可以创建一个recursive_wrapper,使你能够任意嵌套内容。还有其他方法,比如使用一个大尺寸的单一平面数组,或者你可以使用继承和动态分配,但它们都需要更多的麻烦。
typedef boost::variant<
    int,
    std::vector<boost::recursive_variant_>
> variant;

int main() {
    std::vector<variant> var; // Assume at least 1 dimension
}

4
您无法在编译时设置数据类型,但使用一个具有正确总元素数量的单个数组并创建映射是非常实用的,这样您的逻辑 [i1][i2][...] 就可以在 [i1*v2*v3...vk + i2*v3..vk + ...] 处找到。

1
+1 这正是我过去所做的。支持“索引器”的撕开每个 [] 操作符并返回另一个索引器,直到达到最终维度是最困难的部分(如果对您很重要拥有 ar[i1][i2][i3]...[iN]。如果不是,并且常规函数接口可接受,则可以在很少的代码量中完成)。顺便说一句,好答案。 - WhozCraig

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