From 762397776e12e17d848c64daad0c07db09bc36f5 Mon Sep 17 00:00:00 2001 From: Lingjie Zhu Date: Thu, 6 Jul 2017 15:31:32 +0800 Subject: [PATCH] switch to priority_queue --- .../internal/Surface_mesh_approximation/VSA.h | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/Surface_mesh_approximation/include/CGAL/internal/Surface_mesh_approximation/VSA.h b/Surface_mesh_approximation/include/CGAL/internal/Surface_mesh_approximation/VSA.h index 35ea80b3333..d75883315a6 100644 --- a/Surface_mesh_approximation/include/CGAL/internal/Surface_mesh_approximation/VSA.h +++ b/Surface_mesh_approximation/include/CGAL/internal/Surface_mesh_approximation/VSA.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -85,17 +86,6 @@ public: face_descriptor seed; }; - // The facet candidate to be queued. - struct FacetToIntegrate { - face_descriptor f; - std::size_t i; - FT fit_error; - - bool operator<(const FacetToIntegrate &rhs) const { - return this->fit_error < rhs.fit_error; - } - }; - // The l21 metric, compute the fitting error from a facet to a plane proxy. struct L21Metric { L21Metric(GeomTraits traits, @@ -413,14 +403,21 @@ private: */ template void flooding(FacetSegmentMap &seg_pmap) { - typedef std::multiset CandidateSet; + // The facet candidate to be queued. + struct FacetToIntegrate { + face_descriptor f; + std::size_t i; + FT fit_error; + bool operator<(const FacetToIntegrate &rhs) const { + return fit_error > rhs.fit_error; + } + }; BOOST_FOREACH(face_descriptor f, faces(mesh)) seg_pmap[f] = CGAL_NOT_TAGGED_ID; - const std::size_t num_proxies = proxies.size(); - CandidateSet facet_candidates; - for (std::size_t i = 0; i < num_proxies; ++i) { + std::priority_queue facet_pqueue; + for (std::size_t i = 0; i < proxies.size(); ++i) { face_descriptor f = proxies[i].seed; seg_pmap[f] = i; @@ -431,14 +428,14 @@ private: cand.f = fadj; cand.fit_error = fit_error(fadj, proxies[i]); cand.i = i; - facet_candidates.insert(cand); + facet_pqueue.push(cand); } } } - while (!facet_candidates.empty()) { - const FacetToIntegrate &c = *(facet_candidates.begin()); - facet_candidates.erase(facet_candidates.begin()); + while (!facet_pqueue.empty()) { + const FacetToIntegrate c = facet_pqueue.top(); + facet_pqueue.pop(); if (seg_pmap[c.f] == CGAL_NOT_TAGGED_ID) { seg_pmap[c.f] = c.i; BOOST_FOREACH(face_descriptor fadj, faces_around_face(halfedge(c.f, mesh), mesh)) { @@ -448,7 +445,7 @@ private: cand.f = fadj; cand.fit_error = fit_error(fadj, proxies[c.i]); cand.i = c.i; - facet_candidates.insert(cand); + facet_pqueue.push(cand); } } }