Skip to content

Instantly share code, notes, and snippets.

@ygabo
Created June 10, 2013 12:19
Show Gist options
  • Save ygabo/5748328 to your computer and use it in GitHub Desktop.
Save ygabo/5748328 to your computer and use it in GitHub Desktop.
Generate combinations from a given set.
#include <vector>
#include <stdint.h>
#include <iostream>
template <typename Iterator>
inline bool next_combination(const Iterator first, Iterator k, const Iterator last)
{
/* Credits: Thomas Draper */
if ((first == last) || (first == k) || (last == k))
return false;
Iterator itr1 = first;
Iterator itr2 = last;
++itr1;
if (last == itr1)
return false;
itr1 = last;
--itr1;
itr1 = k;
--itr2;
while (first != itr1)
{
if (*--itr1 < *itr2)
{
Iterator j = k;
while (!(*itr1 < *j)) ++j;
std::iter_swap(itr1,j);
++itr1;
++j;
itr2 = k;
std::rotate(itr1,j,last);
while (last != j)
{
++j;
++itr2;
}
std::rotate(k,itr2,last);
return true;
}
}
std::rotate(first,k,last);
return false;
}
void main(){
// 5-choose-3
std::size_t n =184;
std::size_t k = 3;
std::vector<int> ints;
for (int i = 0; i < n; ints.push_back(i++));
do
{
for (int i = 0; i < k; ++i)
{
std::cout << ints[i] << " ";
}
std::cout << "\n";
}
while(next_combination(ints.begin(),ints.begin() + k,ints.end()));
std::cin.get();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment