#include <QCoreApplication> // QT += core
#include <QtConcurrent> // QT += concurrent
return pt1.x() < pt2.x();
}
static QAtomicInt ignored = 0;
struct FindClosestPoint
{
FindClosestPoint(const QVector<QPoint> &vec) : B(vec) {}
{
double distance = -1;
const int len = B.size();
candidate = B.at(0);
distance = (point-B.at(0)).manhattanLength(); // for simplicity, you can use Euclidean distance
for(int i=1;i < len; ++i) {
if(qAbs(point.x()-B.at(i).x()) >= distance){
qDebug() << "Ignored" << len-i-1 << "elements";
ignored.fetchAndAddAcquire(len-i-1);
return candidate; // stop condition
}
double newDist = (point-B.at(i)).manhattanLength(); // for simplicity
if(newDist < distance) {
distance = newDist;
candidate = B.at(i);
}
}
return candidate;
}
QVector<QPoint> B;
};
int main(int argc, char *argv[])
{
QVector<QPoint> A;
QVector<QPoint> B;
qsrand
(QDateTime::currentDateTime().
toTime_t());
int lenA = qrand() % 1000;
int lenB = qrand() % 1000;
for(int i=0;i<lenA;++i) {
QPoint pt
(qrand
() % 100, qrand
() % 100);
QVector<QPoint>::iterator iter = qLowerBound(A.begin(), A.end(), pt, lessThanX);
A.insert(iter, pt);
}
for(int i=0; i<lenB; ++i) {
QPoint pt
(qrand
() % 100, qrand
() % 100);
QVector<QPoint>::iterator iter = qLowerBound(B.begin(), B.end(), pt, lessThanX);
B.insert(iter, pt);
}
QVector<QPoint> results = QtConcurrent::blockingMapped(A, FindClosestPoint(B));
for(int i=0;i<results.count();++i) {
qDebug() << i << A.at(i) << results.at(i);
}
int totIgnored = ignored.load();
qDebug() << "Average ignored elements:" << totIgnored << "out of " << A.size()*B.size();
return 0;
}
#include <QCoreApplication> // QT += core
#include <QtConcurrent> // QT += concurrent
bool lessThanX(const QPoint &pt1, const QPoint &pt2) {
return pt1.x() < pt2.x();
}
static QAtomicInt ignored = 0;
struct FindClosestPoint
{
FindClosestPoint(const QVector<QPoint> &vec) : B(vec) {}
typedef QPoint result_type;
QPoint operator()(const QPoint &point)
{
QPoint candidate;
double distance = -1;
const int len = B.size();
candidate = B.at(0);
distance = (point-B.at(0)).manhattanLength(); // for simplicity, you can use Euclidean distance
for(int i=1;i < len; ++i) {
if(qAbs(point.x()-B.at(i).x()) >= distance){
qDebug() << "Ignored" << len-i-1 << "elements";
ignored.fetchAndAddAcquire(len-i-1);
return candidate; // stop condition
}
double newDist = (point-B.at(i)).manhattanLength(); // for simplicity
if(newDist < distance) {
distance = newDist;
candidate = B.at(i);
}
}
return candidate;
}
QVector<QPoint> B;
};
int main(int argc, char *argv[])
{
QVector<QPoint> A;
QVector<QPoint> B;
qsrand(QDateTime::currentDateTime().toTime_t());
int lenA = qrand() % 1000;
int lenB = qrand() % 1000;
for(int i=0;i<lenA;++i) {
QPoint pt(qrand() % 100, qrand() % 100);
QVector<QPoint>::iterator iter = qLowerBound(A.begin(), A.end(), pt, lessThanX);
A.insert(iter, pt);
}
for(int i=0; i<lenB; ++i) {
QPoint pt(qrand() % 100, qrand() % 100);
QVector<QPoint>::iterator iter = qLowerBound(B.begin(), B.end(), pt, lessThanX);
B.insert(iter, pt);
}
QVector<QPoint> results = QtConcurrent::blockingMapped(A, FindClosestPoint(B));
for(int i=0;i<results.count();++i) {
qDebug() << i << A.at(i) << results.at(i);
}
int totIgnored = ignored.load();
qDebug() << "Average ignored elements:" << totIgnored << "out of " << A.size()*B.size();
return 0;
}
To copy to clipboard, switch view to plain text mode
Bookmarks