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