算法名称?:连接由应用于范围的每个元素的函数返回的范围

Algorithm name?: Concatenate the ranges returned by a function applied to each element of a range

也许我漏掉了什么。 <algorithm> 中是否有函数可以执行此操作?如果不是,你会怎么称呼它?这似乎是一种特殊的 transform-reduce 风格,非常具体,需要一个名称:

template <typename Iter, typename OutIter, typename Fn>
void transformed_concatenated(Iter beg, Iter end, OutIter out, Fn f) {
    for (; beg != end; ++beg) {
        for (auto& x : f(*beg)) {
            *out++ = std::move(x);
        }
    }
    return out;
}

也就是说,如果我这样做

const std::vector<int> input { 0, 1, 2, 3 };
const auto f = [](int n) { return std::vector<int>(n, n * 2 + 1); };
std::vector<int> result;
transformed_concatenated(input.begin(), input.end(), std::back_inserter(result), f);

我会得到 3, 5, 5, 7, 7, 7.

std::transform_reduce可以完成类似的事情,但我觉得它失去了一些东西。

使用 C++20 中引入的范围和视图,您可以编写:

std::ranges::copy(input 
                  | std::views::transform(f) 
                  | std::views::join, 
                  std::back_inserter(result));

这里是 demo


请注意,您的函数 f 不正确。必须

const auto f = [](int n) { return std::vector<int>(n, n); };
                                               // ^____^

以获得所需的输出 1 2 2 3 3 3。如果您使用大括号构造向量,您将得到一个包含 2 个元素的向量,它们的值都为 n,输出将为 1 1 2 2 3 3.