声明一个采用泛型输入和输出迭代器的函数

时间:2013-11-04 09:32:51

标签: c++ templates

我想修改这个函数,以便通过获取输入迭代器并写入输出迭代器而不是它当前正在进行的操作来模仿标准库算法。

以下是代码

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);

我的问题是写声明。我假设它涉及iterator traits,但我无法弄清楚语法。

1 个答案:

答案 0 :(得分:1)

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

其次,你无法初始化这样的矢量矢量。

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

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

}

它会正常工作。