22void cartesianProduct(std::vector<std::vector<T>> &out, std::vector<std::vector<T>> &in)
25 typename std::vector<T>::const_iterator begin;
26 typename std::vector<T>::const_iterator end;
27 typename std::vector<T>::const_iterator me;
30 std::vector<Digits> vd;
31 vd.reserve(in.size());
33 for (
auto it = in.begin(); it != in.end(); ++it) {
34 Digits
d = {(*it).begin(), (*it).end(), (*it).begin()};
39 std::vector<T> result;
40 for (
auto it = vd.begin(); it != vd.end(); ++it) {
41 result.push_back(*(it->me));
43 out.push_back(result);
45 for (
auto it = vd.begin();;) {
47 if (it->me == it->end) {
48 if (it + 1 == vd.end()) {