In range-v3, creating a pipeline that transforms elements of a potentially infinite range using a third-party function that returns a vector can be challenging due to the inability to create views of temporary containers.
Consider the following code:
auto rng = src | view::transform(f) | view::join;
where src is an infinite range of type T, and f is a third-party function that returns a std::vector
Recent updates to range-v3 have introduced a solution to this issue: the views::cache1 operator. This operator creates a temporary container that stores the output of a transformation, allowing other views in the pipeline to access its elements.
To implement the desired pipeline correctly, add views::cache1 before views::join:
auto rng = src | view::transform(f) | views::cache1 | views::join;
The following code sample demonstrates the usage of views::cache1 in practice:
<code class="cpp">auto rng = views::iota(0, 4) | views::transform([](int i) { return std::string(i, char('a' + i)); }) | views::cache1 | views::join('-'); check_equal(rng, {'-', 'b', '-', 'c', 'c', '-', 'd', 'd', 'd'});</code>
It's important to note that the transformed range rng does not retain all the range properties of its source range. In the example above, it loses the forward range concept due to the creation of temporary containers.
The above is the detailed content of How can I transform an infinite range with a function returning temporary containers in range-v3?. For more information, please follow other related articles on the PHP Chinese website!