【问题标题】:How will I pass ranges instead of iterator-pairs in C++20?如何在 C++20 中传递范围而不是迭代器对?
【发布时间】:2019-05-10 18:00:06
【问题描述】:

我听说 C++20 将支持作用于范围,而不仅仅是开始+结束迭代器对。这是否意味着,在 C++20 中,我将能够编写:

std::vector<int> vec = get_vector_from_somewhere();
std::sort(vec);
std::vector<float> halves; 
halves.reserve(vec.size());
std::transform(
    vec, std::back_inserter(halves),
    [](int x) { return x * 0.5; }
);

?

【问题讨论】:

    标签: c++ range c++20


    【解决方案1】:

    几乎,是的!

    您只需要使用std::ranges:: 命名空间,而不仅仅是std::;至少,这是 Eric Niebler says 在他的博客文章中的内容。所以,你会写:

    std::vector<int> vec = get_vector_from_somewhere();
    std::ranges::sort(vec);
    std::vector<float> halves; 
    halves.reserve(vec.size());
    std::ranges::transform(
        vec, std::back_inserter(halves),
        [](int x) { return x * 0.5; }
    );
    

    您还可以查看std::all_of(以及none_ofany_of)上的cppreference page,了解C++20 风格&lt;algorithm&gt; 代码的详细示例;但并非所有这些页面都写在 cppreference.com 上。

    【讨论】:

    • 我对范围库不是很熟悉,但是从示例中,您似乎可以使用管道语法仅用 1 或 2 行非常紧凑地表达此代码。如果可能的话,很高兴看到这样的例子。
    • @alterigel:我自己并不完全熟悉它;你可能是对的——尽管我特别想使用类似于现有语法的语法。
    • auto halves = vec | view::transform([](int x){ return x * 0.5; }) | ranges::to&lt;std::vector&lt;float&gt;&gt;;view::transform 将在 C++20 中,ranges::to 不会,但你可以从 range-v3 借用它)
    • @Barry:好吧,你不能“只是借用”它,它在 range-v3 中有一堆依赖项。另外,它是to_IIANM。
    • @einpoklum 你是对的,它是to_。从 range-v3 借用它,我的意思是使用 range-v3 - 不像...删掉那个特定的东西。
    猜你喜欢
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 2014-03-15
    • 2020-12-20
    • 2017-05-13
    • 2020-10-14
    相关资源
    最近更新 更多