指向指针的指针数组,其中值在编译时已知

时间:2014-07-23 22:46:08

标签: c++

我正在实施一个硬编码值的查找表,如果我可以做这样的事情会很有用:

double *table[rows];
table[0] = {1.0, 4.32};
table[1] = {2.0, 3.22};

重要的是它需要具有类型:double **

我现在的解决方案是拥有一个数组数组,然后一次变成一个双**行 - 但这有点像黑客......

此表需要传递给函数:

double NearestNeighbour(double** table, int width, int height, double key[]) 

其中widthheight是输入表的维度。

2 个答案:

答案 0 :(得分:7)

嗯,你总是可以做到

const double table2d[2][2] = 
{
  { 1.0, 4.32 },
  { 2.0, 3.22 }
};

const double *const table[2] = 
{
  table2d[0],
  table2d[1]
};

假设使用静态存储持续时间声明table2d

答案 1 :(得分:3)

由于C ++ 11允许类类型的文字,您可以使用返回double *的成员函数的文字构建表:

#include <array>

double *table[] = 
{
    &std::array<double, 3>{ 1.0, 2.0, 3.0 }[0]
,   &std::array<double, 3>{ 4.0, 5.0, 6.0 }[0]
};

然而,这非常难看。特别是考虑到在调用NearestNeighbour时手动必须记住表格宽度。

您现有的解决方案(或仅构建一次并保存表并自动保留列数的版本)可能是最佳解决方案。


如果可能的话,看看你是否可以修改NearestNeighbour。首先,如果它没有修改表,那么它应该被编写为double const *const *table。然后,您可以将const表传递给它。

如果您可以访问它的源代码,那么您可以将其重新实现为模板函数以接受任何元素类型的数组,例如。

template<typename RowT, size_t NumRows> 
double NearestNeighbour( RowT (&table)[NumRows], double *key )
{
    // here access table[row][col]
    // or even more generally, iterate over begin(table[row]), end(table[row])
}

使用模板确实有缺点,模板必须出现在标题中。