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

C++ 算法名称?:连接应用于范围中每个元素的函数返回的范围,c++,algorithm,stl,stl-algorithm,C++,Algorithm,Stl,Stl 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

也许我错过了什么。
中是否有这样的函数?如果不是,你会怎么称呼它?它似乎是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;
}
模板
连接无效(Iter beg、Iter end、OutIter out、Fn f){
for(;beg!=结束;++beg){
用于(自动和x:f(*beg)){
*out++=std::move(x);
}
}
返回;
}
也就是说,如果我这样做的话

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);
向量输入{0,1,2,3}; const auto f=[](int n){return std::vector(n,n*2+1);}; std::向量结果; 转换的插入器(input.begin()、input.end()、std::back\u插入器(result)、f); 我会得到
3,5,5,7,7,7


类似的事情可以用std::transform\u reduce来完成,但我觉得它失去了一些东西。

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

std::ranges::copy(input 
                  | std::views::transform(f) 
                  | std::views::join, 
                  std::back_inserter(result));
这是一个例子


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

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

获取所需的输出
1233
。如果使用大括号构造向量,将得到一个包含两个元素的向量,两个元素的值均为
n
,输出将为
1233

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

std::ranges::copy(input 
                  | std::views::transform(f) 
                  | std::views::join, 
                  std::back_inserter(result));
这是一个例子


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

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

获取所需的输出
1233
。如果您使用大括号来构造向量,您将得到一个包含两个元素的向量,两个元素的值都是
n
,输出将是
1233

您能否添加一个关于代码应该做什么的文本描述(除了代码之外)?我不喜欢依赖对某个人代码的解释来确定他们的意图。这有时被称为
flatMap
。除了文本解释之外,为函数添加输入和所需输出的示例也会很有帮助。您可以添加代码应该做什么的文本描述吗(除守则外)?我不喜欢依赖对某人代码的解释来确定他们的意图。这有时被称为
flatMap
。除了文本解释之外,为函数添加输入和所需输出的示例也会很有帮助。很好!考虑到这一点,我想
transform\u join
将是我的好名字老式的非范围版本。@Ben是的,这将是函数的好名字。很好!考虑到这一点,我想
transform\u join
将是我老式的非范围版本的好名字。@Ben是的,这将是函数的好名字。