fork download
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4.  
  5. bool increase(std::size_t size, std::vector<std::size_t>& it)
  6. {
  7. for (std::size_t i = 0, size = it.size(); i != size; ++i) {
  8. const std::size_t index = size - 1 - i;
  9. ++it[index];
  10. if (it[index] > size) {
  11. it[index] = 0;
  12. } else {
  13. return true;
  14. }
  15. }
  16. return false;
  17. }
  18.  
  19. template <typename F, typename T>
  20. void self_cartesian_product(F&& f, const std::vector<T>& v, std::size_t N)
  21. {
  22. std::vector<std::size_t> it(N, 0);
  23.  
  24. do {
  25. f(v, it);
  26. } while (increase(v.size(), it));
  27. }
  28.  
  29.  
  30. int main()
  31. {
  32. self_cartesian_product([](const auto& v, const auto& indexes)
  33. {
  34. for (auto i : indexes) {
  35. std::cout << v[i] << " ";
  36. }
  37. std::cout << std::endl;
  38. },
  39. std::vector<int>{-2, -1, 0, 1, 2},
  40. 3);
  41. }
  42.  
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
-2 -2 -2 
-2 -2 -1 
-2 -2 0 
-2 -2 1 
-2 -1 -2 
-2 -1 -1 
-2 -1 0 
-2 -1 1 
-2 0 -2 
-2 0 -1 
-2 0 0 
-2 0 1 
-2 1 -2 
-2 1 -1 
-2 1 0 
-2 1 1 
-1 -2 -2 
-1 -2 -1 
-1 -2 0 
-1 -2 1 
-1 -1 -2 
-1 -1 -1 
-1 -1 0 
-1 -1 1 
-1 0 -2 
-1 0 -1 
-1 0 0 
-1 0 1 
-1 1 -2 
-1 1 -1 
-1 1 0 
-1 1 1 
0 -2 -2 
0 -2 -1 
0 -2 0 
0 -2 1 
0 -1 -2 
0 -1 -1 
0 -1 0 
0 -1 1 
0 0 -2 
0 0 -1 
0 0 0 
0 0 1 
0 1 -2 
0 1 -1 
0 1 0 
0 1 1 
1 -2 -2 
1 -2 -1 
1 -2 0 
1 -2 1 
1 -1 -2 
1 -1 -1 
1 -1 0 
1 -1 1 
1 0 -2 
1 0 -1 
1 0 0 
1 0 1 
1 1 -2 
1 1 -1 
1 1 0 
1 1 1