Escrevendo Range Pipelines com Contêineres Temporários
No range-v3, ao trabalhar com um pipeline que utiliza uma função de terceiros que retorna um vetor, é essencial criar um pipeline que mapeie essa função para todos os elementos do intervalo e nivele todos os vetores resultantes em um único intervalo com todos os seus elementos.
Inicialmente, pode-se tentar escrever um pipeline como como:
auto rng = src | view::transform(f) | view::join;
No entanto, essa abordagem anteriormente não era viável, pois é impossível criar visualizações de contêineres temporários como os produzidos por f.
Para resolver esse problema, um patch foi introduzido que agora permite que tais pipelines de intervalo sejam escritos corretamente. A chave é adicionar o operador views::cache1 ao pipeline, como visto no exemplo a seguir:
auto rng = views::iota(0, 4)
| views::transform([](int i) { return std::string(i, char('a' i)); })
| views::cache1
| views::join('-');
Isso garante que o pipeline processe os contêineres temporários corretamente, permitindo-nos escrever pipelines de intervalo que utilizam contêineres temporários de maneira eficaz.
Para o problema descrito em a questão, a solução seria modificar o pipeline da seguinte forma:
auto rng = src | views::transform(f) | views::cache1 | views::join;
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3