fork download
  1. #include <array>
  2. #include <bitset>
  3. #include <iostream>
  4.  
  5. template <std::size_t N>
  6. bool increase(std::bitset<N>& bs)
  7. {
  8. for (std::size_t i = 0; i != bs.size(); ++i) {
  9. if (bs.flip(i).test(i) == true) {
  10. return true;
  11. }
  12. }
  13. return false; // overflow
  14. }
  15.  
  16. template <typename T, std::size_t N>
  17. void display(const std::array<T, N>& a, const std::bitset<N>& bs)
  18. {
  19. std::cout << '{';
  20. const char* sep = "";
  21.  
  22. for (std::size_t i = 0; i != bs.size(); ++i) {
  23. if (bs.test(i)) {
  24. std::cout << sep << a[i];
  25. sep = ", ";
  26. }
  27. }
  28. std::cout << '}' << std::endl;
  29. }
  30.  
  31. template <typename T, std::size_t N>
  32. void display_all_subsets(const std::array<T, N>& a)
  33. {
  34. std::bitset<N> bs;
  35.  
  36. do {
  37. display(a, bs);
  38. } while (increase(bs));
  39. }
  40.  
  41. int main()
  42. {
  43. const std::array<int, 3> a = {1, 2, 3};
  44. display_all_subsets(a);
  45.  
  46. return 0;
  47. }
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
{}
{1}
{2}
{1, 2}
{3}
{1, 3}
{2, 3}
{1, 2, 3}