要求:有2組數據,一組有節點編號和座標,另一組只有節點座標和結果值(節點座標精度不一樣),要求匹配節點編號和結果值。
想法1:本來想通過將座標轉爲統一精度,再組成字符串,通過QMap<QString,int>有序查找編號,但發現不同精度的結果統一精度後不一樣。
//用QString::number方法對於不同精度的數舍入方法未知,如:
QString str1 = "5.8122662353515625e+02";
QString str2 = "5.812266235E+02";
QString result1 = QString::number(str1.toDouble(), 'e', 8);
QString result2 = QString::number(str2.toDouble(), 'e', 8);
cout << str1.toDouble() << endl << str2.toDouble() << endl;
//結果:5.81226624e+2
// 5.81226623e+2
//用C語言的sprintf結果對於這組數據不太一樣,但其他數據也有類似情況,說明這個想法不可行。
想法2:同QHash<XYZ,int>,其中XYZ爲自定義類,保存節點座標。QHash用自定義類作爲key時,要重載==運算符,並且要有一個全局qHash函數:
header.h:
#ifndef HEADER_H
#define HEADER_H
#include <math.h>
#include <QString>
#include <QHash>
class XYZ
{
public:
XYZ(double x,double y,double z)
{
this->x=x;
this->y=y;
this->z=z;
}
double x,y,z;
bool operator==(const XYZ& obj) const
{
double torrent = pow(0.1f, 10);
if (abs(this->x - obj.x) < torrent && abs(this->y - obj.y) < torrent && abs(this->z - obj.z) < torrent)
return true;
else
return false;
}
};
uint qHash(const XYZ &key, uint seed);
#endif // HEADER_H
xyz.cpp:
#include "header.h"
uint qHash(const XYZ &key, uint seed)
{
QString str=QString::number(key.x, 10, 4) + QString::number(key.y, 10, 4) + QString::number(key.y, 10, 4);
return qHash(str, seed);
}
//main.cpp
#include <QCoreApplication>
#include <iostream>
#include "header.h"
#include <math.h>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QHash<XYZ,int> maps;
maps.insert(XYZ(1,1,1),1);
cout<<maps[XYZ(1,1,1)]<<endl;
return a.exec();
}