C++ 如果维度在编译时未知,如何实现多维数组?

C++ 如果维度在编译时未知,如何实现多维数组?,c++,multidimensional-array,C++,Multidimensional Array,我想实现一个函数,该函数以整数数组的维数“n”作为参数。此函数还获取定义数组大小的值“k_1,k_2,…,k_n”。然后这个函数将填充这个n维数组 我如何用C++ +?/P>高效地实现这一点? 例如,对于n=3,我将使用 vector < vector < vector < int > > > array; vector

我想实现一个函数,该函数以整数数组的维数“n”作为参数。此函数还获取定义数组大小的值“k_1,k_2,…,k_n”。然后这个函数将填充这个n维数组

<>我如何用C++ +?/P>高效地实现这一点? 例如,对于n=3,我将使用

vector < vector < vector < int > > > array;
vector>数组;

但是我在编译时不知道维度。

使用一维数组,并使用偏移量的乘法来伪造其他维度以进行索引,您可以通过向量传递维度大小,即

std::vector<int> create_md_array(const std::vector<int> & dimensions)
{
    int size = std::accumulate(dimensions.begin(), dimensions.end(), 1, std::multiplies<int>());
    return std::vector<int>(size);
}
std::vector create\u md\u数组(const std::vector&dimensions)
{
int size=std::accumulate(dimensions.begin()、dimensions.end()、1、std::multiplies());
返回标准::向量(大小);
}

使用一维数组,并使用偏移量的乘法伪造其他维度以进行索引,您可以通过向量传递维度大小,即

std::vector<int> create_md_array(const std::vector<int> & dimensions)
{
    int size = std::accumulate(dimensions.begin(), dimensions.end(), 1, std::multiplies<int>());
    return std::vector<int>(size);
}
std::vector create\u md\u数组(const std::vector&dimensions)
{
int size=std::accumulate(dimensions.begin()、dimensions.end()、1、std::multiplies());
返回标准::向量(大小);
}

您有两个选择。您可以自己实现它,基本上用坐标乘以大小来线性化多维地址,只需使用一个简单的
std::vector
来保存数据


或者,您可以使用
std::valarray
和朋友来完成同样的任务。它有一组专门针对您所描述的情况的类,但是它们很少使用,几乎没有人理解它们。自己编写代码很有可能让大多数人更容易阅读和理解。

您有两种选择。您可以自己实现它,基本上用坐标乘以大小来线性化多维地址,只需使用一个简单的
std::vector
来保存数据


或者,您可以使用
std::valarray
和朋友来完成同样的任务。它有一组专门针对您所描述的情况的类,但是它们很少使用,几乎没有人理解它们。自己编写代码很有可能让大多数人更容易阅读和理解。

如果n是你的维度,k_1…k_n几乎不够数据。n维数组是问题或解决方案的一部分吗?如果n是你的维度,k_1…k_n几乎没有足够的数据。n维数组是问题的一部分还是解决方案?好主意。然后可以扩展
std::vector
,为获取和设置此数组的元素提供一些语法糖(例如重载
操作符()
)@Murilo:I不会扩展
vector
。这将被包装在一个单独的类中。我实际上在cpp中实现了一个N维数组。我就是这么做的,好主意。然后可以扩展
std::vector
,为获取和设置此数组的元素提供一些语法糖(例如重载
操作符()
)@Murilo:I不会扩展
vector
。这将被包装在一个单独的类中。我实际上在cpp中实现了一个N维数组。这就是我所做的。