【发布时间】:2015-06-26 20:32:10
【问题描述】:
使用 boost 查询积分时,我似乎得到了不正确的结果。使用单独的算法(使用 BST),每个查询平均得到 2000 分的答案,但使用 boost 我得到 10 分的答案。这是我第一次使用 Boost,所以有人可以帮我解决我的问题。
关于代码:我放了 1M 个随机点(x,y 介于 0 和 1 之间)。然后我对 100 个小的随机区域运行查询并计算匹配数。
#include <iostream>
#include <vector>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/geometries.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/index/rtree.hpp>
using namespace std;
namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
typedef bg::model::point<double, 2, bg::cs::cartesian> point;
typedef bg::model::box<point> box;
struct particle
{
double x;
double y;
};
int main(int argc, char *argv[])
{
int N=1000000;
clock_t start,stop;
vector<particle> myvec(N);
vector<particle>::iterator cii;
//Set vector values
for (cii = myvec.begin(); cii != myvec.end(); ++cii)
{
cii->x =1.0*rand()/RAND_MAX;
cii->y =1.0*rand()/RAND_MAX;
}
//Build R-tree
start=clock();
bgi::rtree<point, bgi::quadratic<16> > rtree;
for (cii=myvec.begin();cii!=myvec.end(); ++cii)
{
double x = cii->x;
double y = cii->y;
point p(x,y);
rtree.insert(p);
}
stop=clock();
cout<<"Time for building R tree "<<(stop-start)/(double) CLOCKS_PER_SEC<<endl;
//Build Query List
vector<particle> querylist(100);
for (cii = querylist.begin(); cii != querylist.end(); ++cii)
{
cii->x =1.0*rand()/RAND_MAX;
cii->y =1.0*rand()/RAND_MAX;
}
//Query R-tree
start=clock();
for (cii = querylist.begin(); cii != querylist.end(); ++cii)
{
double x = cii->x;
double y = cii->y;
double lx = x - .001;
double ux = x + .001;
double ly = y - .001;
double uy = y + .001;
point p1(lx,ly), p2(ux,uy);
box query_box(p1, p2);
vector<point> queryresult;
rtree.query(bgi::intersects(query_box), std::back_inserter(queryresult));
std::cout << "The intersection has " << (queryresult.size()) << " elements:\n";
}
stop=clock();
cout<<"Time for query "<<(stop-start)/(double) CLOCKS_PER_SEC<<endl;
return 0;
}
【问题讨论】:
-
老兄,请将您的代码修改为
C++,因为它现在基本上是C with classes。请不要使用std::rand()(谷歌搜索)。使用std::chrono进行时间测量。这段代码伤害了我。 -
除了格式化这段代码对我来说看起来还不错。我明天去看看,以防没有其他人介入
标签: c++ boost boost-geometry