From 5077d7e966ddf077867b9badaf2ab9e6e01f90eb Mon Sep 17 00:00:00 2001 From: Joshua Moerman Date: Mon, 17 Feb 2014 16:51:45 +0100 Subject: [PATCH] Small improvement in speed --- include/clusters.hpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/include/clusters.hpp b/include/clusters.hpp index bb7326e..4e98e42 100644 --- a/include/clusters.hpp +++ b/include/clusters.hpp @@ -2,6 +2,7 @@ #include #include +#include // Using boost flat set was faster than std::set. @@ -41,18 +42,23 @@ auto cluster_at(Field const & field, typename Field::Position const & p){ return ret; } - -template -auto all_clusters(Field const & field, Rules const & rules){ - boost::container::flat_set()))> ret; +template +auto all_clusters(Grid const & grid, Rules const & rules){ + std::vector()))> ret; ret.reserve(10); - for(auto&& p : field.all_positions()){ - if(field.empty(p)) continue; - ret.insert(cluster_at(field, p)); - } - for(auto it = ret.begin(); it != ret.end();){ - if (it->size() < rules.min_cluster_size()) it = ret.erase(it); - else ++it; + auto partition = make_empty(grid, grid.all_positions()); + auto current_p = 1; + for(auto&& p : partition.all_positions()){ + if(!partition.empty(p) || grid.empty(p)) continue; + + auto cluster = cluster_at(grid, p); + for(auto&& q : cluster){ + partition.get(q) = current_p; + } + + current_p++; + if(cluster.size() >= rules.min_cluster_size()) ret.push_back(std::move(cluster)); } + return ret; }