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

1

首先,不要按值传递向量。返回值可能会被优化和移动(即使它不是 c++11),作为输入参数,编译器很难知道它是否可以只传递一个引用。

其次,您不能像这样初始化向量的向量。

现在,对于语法,只需使用:

std::vector<std::vector<T>> find_combinations(std::vector<std::vector<T>>& v) {

}

它会正常工作。

于 2013-11-04T09:46:42.317 回答