这里有不同的问题:
1. 使用 double 作为 QMap 的键类型
使用 aQMap<double, Foo>
是一个非常糟糕的主意。原因是这是一个允许您访问Foo
给定 a的容器double
。例如:
map[0.45] = foo1;
map[15.74] = foo2;
这是有问题的,因为要检索 中包含的数据map[key]
,您必须测试是否key
等于、小于或大于映射中的其他键。在您的情况下,键是 a double
,并且测试两个double
s 是否相等不是“安全”操作。
2. 使用 int 作为键,而你定义它是 double
这里:
Scan_Data.valid_filters[i][j]=valid_filters[i][j];
i
是一个整数,你说它应该是一个双精度数。
3.您的循环仅测试 (i,j) = (0,0)
你知道吗
for(int i=0;i<1;i++)
{
for(int j=0;j<1;j++)
{
Scan_Data.valid_filters[i][j]=valid_filters[i][j];
printf("\nValid_filters=%f",Scan_Data.valid_filters[i][j]);
}
}
相当于:
Scan_Data.valid_filters[0][0]=valid_filters[0][0];
printf("\nValid_filters=%f",Scan_Data.valid_filters[0][0]);
?
4. 使用 operator[] 访问向量是不安全的
当你这样做时:
Scan_Data.valid_filters[i][j]
你实际上是这样做的:
QFilterDataMap1D & v = Scan_Data.valid_filters[i]; // call QMap::operator[](double)
double d = v[j]; // call QVector::operator[](int)
第一个是安全的,如果它不存在则创建条目。第二个不安全,向量中的第 j 个元素必须已经存在,否则它会崩溃。
解决方案
看来您实际上想要一个二维数组(即矩阵)。为此,请使用:
typedef QVector<double> QFilterDataMap1D;
typedef QVector<QFilterDataMap1D> QFilterDataMap2D;
然后,当您想在另一个中传输时,只需使用:
Scan_Data.valid_filters = valid_filters;
或者,如果您想自己做:
Scan_Data.valid_filters.clear();
for(int i=0;i<n;i++)
{
Scan_Data.valid_filters << QFilterDataMap1D();
for(int j=0;j<m;j++)
{
Scan_Data.valid_filters[i] << valid_filters[i][j];
printf("\nValid_filters=%f",Scan_Data.valid_filters[i][j]);
}
}
如果你想要一个 3D 矩阵,你会使用:
typedef QVector<QFilterDataMap2D> QFilterDataMap3D;