1

この関数を変更して、現在行っていることの代わりに、入力反復子を取得して出力反復子に書き込むことにより、標準ライブラリ アルゴリズムを模倣するようにします。

コードは次のとおりです。

template <class T>
std::vector<std::vector<T>> find_combinations(std::vector<std::vector<T>> v) {
    unsigned int n = 1;
    for_each(v.begin(), v.end(), [&](std::vector<T> &a){ n *= a.size(); });
    std::vector<std::vector<T>> combinations(n, std::vector<T>(v.size()));
    for (unsigned int i = 1; i <= n; ++i) {
        unsigned int rate = n;
        for (unsigned int j = 0; j != v.size(); ++j) {
            combinations[i-1][j] = v[j].front();
            rate /= v[j].size();
            if (i % rate == 0) std::rotate(v[j].begin(), v[j].begin() + 1, v[j].end());
        }
    }
    return combinations;
}

使用方法:

std::vector<std::vector<int>> input = { { 1, 3 }, { 6, 8 } };
std::vector<std::vector<int>> result = find_combinations(input);

私の問題は宣言を書くことです。イテレータの特性が関係していると思いますが、構文を理解できませんでした。

4

1 に答える 1