我正在实施一个硬编码值的查找表,如果我可以做这样的事情会很有用:
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[])
其中width
和height
是输入表的维度。
答案 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])
}
使用模板确实有缺点,模板必须出现在标题中。