算法名称?:连接由应用于范围的每个元素的函数返回的范围
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
.
也许我漏掉了什么。 <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
.