fork download
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5.  
  6. template <typename T>
  7. bool increase(const std::vector<T>& v, std::vector<std::size_t>& its)
  8. {
  9. for (std::size_t i = 0, size = its.size(); i != size; ++i) {
  10. const std::size_t index = size - 1 - i;
  11. ++its[index];
  12. if (its[index] == v.size()) {
  13. its[index] = 0;
  14. } else {
  15. return true;
  16. }
  17. }
  18. return false;
  19. }
  20.  
  21. template <typename T>
  22. void do_job(const std::vector<T>& v, std::vector<std::size_t>& its)
  23. {
  24. // Print example.
  25. for (std::size_t i = 0, size = v.size(); i != size; ++i) {
  26. std::cout << v[its[i]] << " ";
  27. }
  28. std::cout << std::endl;
  29. }
  30.  
  31. template <std::size_t N>
  32. void test()
  33. {
  34. std::vector<char> v(N);
  35. std::iota(v.begin(), v.end(), 'a');
  36. std::vector<std::size_t> its(N, 0);
  37.  
  38. do {
  39. do_job(v, its);
  40. } while (increase(v, its));
  41.  
  42. }
  43.  
  44.  
  45. int main()
  46. {
  47. test<3>();
  48. }
  49.  
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
a a a 
a a b 
a a c 
a b a 
a b b 
a b c 
a c a 
a c b 
a c c 
b a a 
b a b 
b a c 
b b a 
b b b 
b b c 
b c a 
b c b 
b c c 
c a a 
c a b 
c a c 
c b a 
c b b 
c b c 
c c a 
c c b 
c c c