不同的問題在這裏:
1.採用雙層關鍵型的QMAP
使用QMap<double, Foo>
是一個非常糟糕的主意。原因是這是一個容器,允許您訪問Foo
給定的double
。例如:
map[0.45] = foo1;
map[15.74] = foo2;
這是有問題的,因爲那樣的話,檢索包含在map[key]
的數據,你要測試是否key
或者是等於,小於或大於地圖其他按鍵更大。在你的情況下,密鑰是double
,並測試兩個double
是否等於is not a "safe" operation。
2.使用一個int鍵,同時將它定義爲雙
這裏:
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;
首先謝謝很多回復。對於第三部分,是的,我知道它們是等價的。實際上我的矩陣大小是1 * 900 ..我只是用1 * 1來檢查它。對於解決方案部分,我修改它很少,它的工作很好。你能給我一些建議,我可以怎麼寫3d代碼? typedef QVector \t QFilterDataMap1D; typedef QMap QFilterDataMap2D; \t typedef QMap QFilterDataMap3D; –
@Saad好的,很高興它幫助:-)是的,你提出的是好的。如果您需要更高的效率,您可能實際上需要使用尺寸爲size * sizeY * sizeZ的1D矢量,並使用myEmulated3DArray [i * sizeY * sizeZ + j * sizeZ + k]訪問元素。這種後來的方法更好的原因是各種各樣,但我現在不用擔心它,用最簡單的方法:) – Boris
@Saad。哦,不,我剛剛意識到你再次使用了QMap。沒有!忘掉QMap,你被名字誤導,這真的不是你需要的。 :)對於3D矩陣,使用:'QVector>>' –
Boris