1 #ifndef UTILS_COMBINATION_H 2 #define UTILS_COMBINATION_H 5 #include <KrisLibrary/errors.h> 18 inline void FirstCombination(std::vector<int>& v,
int n)
22 for(
int i=0;i<k;i++) v[i]=i;
25 inline void LastCombination(std::vector<int>& v,
int n)
29 for(
int i=0;i<k;i++) v[i]=i+n-k;
32 inline int NextCombination(std::vector<int>& v,
int n)
36 for(
int i=k-1;i>=0;i--) {
39 FirstCombination(v,n);
44 FirstCombination(v,n);
54 FirstCombination(v,n);
58 inline int PrevCombination(std::vector<int>& v,
int n)
62 for(
int i=k-1;i>=0;i--) {
92 inline Combination(
int _n) :value(_n,0),n(_n),numCycles(0) { FirstCombination(value,n); }
93 inline Combination(
int _k,
int _n) :value(_k,0),n(_n),numCycles(0) { Assert(_k <= _n); FirstCombination(value,n); }
95 numCycles += NextCombination(value,n);
98 inline const Combination& operator ++(
int) {
return operator ++(); }
100 numCycles -= PrevCombination(value,n);
103 inline const Combination& operator --(
int) {
return operator --(); }
104 inline int cycleCount()
const {
return numCycles; }
105 inline bool isDone()
const {
return numCycles>0; }
106 inline const std::vector<int>& operator* ()
const {
return value; }
107 inline const std::vector<int>* operator ->()
const {
return &value; }
111 numCycles = c.numCycles;
114 inline bool operator == (
const Combination& c)
const {
return n == c.n && numCycles == c.numCycles && value == c.value; }
115 inline bool operator < (
const Combination& c)
const {
117 if(numCycles < c.numCycles)
return true;
118 else if(numCycles > c.numCycles)
return false;
119 return std::lexicographical_compare(value.begin(),value.end(),c.value.begin(),c.value.end());
123 std::vector<int> value;
A class that enumerates combinations.
Definition: combination.h:89