algorithme d’emballage dans rtree dans boost

Bonjour à tous, je comprends que si rtree est créé avec des valeurs de plage en boost, il utilisera un algorithme de compression. J’ai besoin d’un exemple de rtree en utilisant l’algorithme d’emballage. Voici mon code qui utilise l’algorithme quadratique

using point = bg::model::point ; using pointI = std::pair; vector contourCenters // has some value bgi::rtree< pointI, bgi::quadratic > rtree; vector cloud; for (size_t i = 0; i < contourCenters.size(); ++i) { int x = contourCenters[i].get (); int y = contourCenters[i].get (); cout << "Contour Centers: (" << x << "," << y << ")"; cloud.push_back(mp(x, y, i)); rtree.insert(make_pair(contourCenters[i], i)); } 

Je voudrais créer rtree avec un algorithme d’emballage, car il semble être le plus rapide en boost. Veuillez m’indiquer comment créer un algorithme d’enregistrement avec boost dans boost.

Vous aurez juste besoin d’utiliser le constructeur de plage .

Pour que cela fonctionne, la plage doit avoir été créée avant la construction de l’arborescence. Le moyen le plus simple d’y parvenir, dans votre exemple, consiste à créer d’abord votre vecteur cloud , puis à en construire l’index:

Live On Coliru

 #include  #include  #include  #include  #include  #include  namespace bg = boost::geometry; namespace bgi = bg::index; using point = bg::model::point ; using pointI = std::pair; pointI mp(int x, int y, size_t v) { return std::make_pair(point(x,y), v); } int main() { std::vector contourCenters; // has some value std::vector cloud; size_t id_gen = 0; std::transform( contourCenters.begin(), contourCenters.end(), back_inserter(cloud), [&](point const& p) { return std::make_pair(p, id_gen++); } ); for(pointI& pi : cloud) std::cout << "Contour Centers: (" << bg::get<0>(pi.first) << "," << bg::get<1>(pi.first) << ")"; bgi::rtree > rtree(cloud); } 

J’ai remplacé la boucle par std::transform pour un bon style, mais vous pouviez garder la boucle telle que vous l’aviez.