范围视图到std :: vector

在拟议的C ++ 20(The One)Ranges TS中,拟议的将​​视图转换为std :: vector的方法是什么?

以下代码无法编译:

int                                           
main() {                                                        
    std::vector<float> values = {1.0,2.0,3.0,4.0,5.2,6.0,7.0,8.0,9.0}; 
    //fmt::print("{}\n",std::experimental::ranges::views::filter(values,[] (float v) { return v < 5.f; })); 
    std::vector<float> foo = vw::filter(values,[] (float v) { return v < 5.f; }); 
    fmt::print("{}\n",foo);                
}

有错误

../src/view.cpp:19:40: error: conversion from     ‘std::experimental::ranges::v1::filter_view<std::experimental::ranges::v1::ref_view<std::vector<float> >,main()::<lambda(float)> >’ to non-scalar type ‘std::vector<float>’ requested
     std::vector<float> foo = vw::filter(values,[] (float v) { return v < 5.f; }); 

(由于某些简历约束,注释行也不会编译)。

那么除了使用基于范围的for循环外,如何对视图做任何事情?

还有一些奖励问题:

  1. 即使遵循该建议,我仍使用cmcstl2实现吗? range-v3似乎不是。
  2. Ranges TS上有任何文档吗?我发现的PDF提案几乎是diff格式的格式错误的代码转储。实际上,直接阅读cmcstl2源代码对我来说更容易阅读。似乎也没有cppreference ...
yhcgyym 回答:范围视图到std :: vector

所以我一直在寻找一个很好的答案。我真正想要的是std::vector的构造函数的重载,例如接受范围

template <std::ranges::input_range R>
vector(R&& r) : vector(r.begin(),r.end()) {
}

但这不是cppreference上的,我在标准草案中看不到它。

我刚刚实现了这一点:

namespace rng = std::ranges;

template <rng::range R>
constexpr auto to_vector(R&& r) {
    using elem_t = std::decay_t<rng::range_value_t<R>>;
    return std::vector<elem_t>{r.begin(),r.end()};
}

可在GCC上使用:https://godbolt.org/z/f2xAcd

本文链接:https://www.f2er.com/3121589.html

大家都在问