Node::PtrList RegionsBuilder::MakeSelectedRegionsByCountry(Region const & country, Regions const & allRegions) { std::vector<LevelRegion> regionsInCountry{{PlaceLevel::Country, country}}; for (auto const & region : allRegions) { if (country.ContainsRect(region)) regionsInCountry.emplace_back(GetLevel(region), region); } auto const comp = [](LevelRegion const & l, LevelRegion const & r) { auto const lArea = l.GetArea(); auto const rArea = r.GetArea(); return lArea != rArea ? lArea > rArea : l.GetRank() < r.GetRank(); }; std::sort(std::begin(regionsInCountry), std::end(regionsInCountry), comp); Node::PtrList nodes; nodes.reserve(regionsInCountry.size()); for (auto && region : regionsInCountry) nodes.emplace_back(std::make_shared<Node>(std::move(region))); return nodes; }