При вставке нового ящика в дерево я хочу сначала проверить, нет ли уже идентичного ящика в дереве. Если это так, я хочу просто получить это значение, иначе мне нужно будет вставить новое значение. Каков наилучший (т.е. наиболее эффективный) способ сделать это?
Я могу сделать это, вызвав nearest(box,1)
, а затем проверив равенство:
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/index/rtree.hpp>
namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
typedef bg::model::point<double, 1, bg::cs::cartesian> TPoint;
typedef bg::model::box<TPoint> TBox;
typedef std::pair<TBox, void*> TPair;
typedef bgi::rtree<TPair, bgi::quadratic<16>> TTree;
TTree::const_query_iterator findExact(const TTree& tree, const TBox& box)
{
auto it = rtree.qbegin(bgi::nearest(box, 1));
if(it == rtree.qend() || !bg::equals(it->first, box))
return rtree.qend();
return it;
}
Действительно ли это лучший (то есть наиболее производительный) способ выполнить этот запрос?