MeshLib C++ Docs
Loading...
Searching...
No Matches
MRFewSmallest.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRMeshFwd.h"
4#include <algorithm>
5#include <cassert>
6#include <vector>
7
8namespace MR
9{
10
12template<typename T>
14{
15public:
17
19 explicit FewSmallest( size_t maxElms ) { reset( maxElms ); }
20
22 void reset( size_t maxElms );
23
25 size_t maxElms() const { return maxElms_; }
26
28 bool empty() const { return heap_.empty(); }
29
31 size_t size() const { return heap_.size(); }
32
34 bool full() const { return size() == maxElms(); }
35
37 const std::vector<T> & get() const { return heap_; }
38
40 const T & top() const { assert( !heap_.empty() ); return heap_.front(); }
41
43 const T & topOr( const T & emptyRes ) const { return !heap_.empty() ? heap_.front() : emptyRes; }
44
46 void push( T t );
47
49 void clear() { heap_.clear(); }
50
51private:
52 std::vector<T> heap_;
53 size_t maxElms_ = 0;
54};
55
56template<typename T>
57void FewSmallest<T>::reset( size_t maxElms )
58{
59 heap_.clear();
60 heap_.reserve( maxElms );
61 maxElms_ = maxElms;
62}
63
64template<typename T>
66{
67 assert( heap_.size() <= maxElms() );
68 if ( heap_.size() == maxElms() )
69 {
70 if ( t < heap_.front() )
71 {
72 std::pop_heap( heap_.begin(), heap_.end() );
73 assert( t < heap_.back() );
74 heap_.back() = std::move( t );
75 std::push_heap( heap_.begin(), heap_.end() );
76 }
77 return;
78 }
79 heap_.push_back( std::move( t ) );
80 std::push_heap( heap_.begin(), heap_.end() );
81}
82
83} //namespace MR
the class stores some number of smallest elements from a larger number of candidates
Definition MRFewSmallest.h:14
void push(T t)
considers one more element, storing it if it is within the smallest
Definition MRFewSmallest.h:65
FewSmallest(size_t maxElms)
configure the object to store at most given number of elements
Definition MRFewSmallest.h:19
const T & top() const
returns the largest among stored smallest elements
Definition MRFewSmallest.h:40
void reset(size_t maxElms)
clears the content and reconfigure the object to store at most given number of elements
Definition MRFewSmallest.h:57
const T & topOr(const T &emptyRes) const
returns the largest among stored smallest elements or given element if this is empty
Definition MRFewSmallest.h:43
bool empty() const
returns whether the container is currently empty
Definition MRFewSmallest.h:28
const std::vector< T > & get() const
returns the smallest elements found so far
Definition MRFewSmallest.h:37
size_t maxElms() const
returns the maximum number of elements to be stored here
Definition MRFewSmallest.h:25
size_t size() const
returns current number of stored element
Definition MRFewSmallest.h:31
bool full() const
returns whether we have already maximum number of elements stored
Definition MRFewSmallest.h:34
void clear()
removes all stored elements
Definition MRFewSmallest.h:49
FewSmallest()
Definition MRFewSmallest.h:16
Definition MRCameraOrientationPlugin.h:8