将视图范围设置为std::vector
Range view to std::vector
在所提出的C++20(the One(Ranges TS中,将视图转换为std::矢量的方法是什么?
以下代码未编译:
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; });
(由于某些CV限制,注释行也不会编译(。
那么,除了使用基于范围的for循环之外,我该如何处理视图呢?
还有一些额外的问题:
- 我使用的cmcst2实现是否遵循了建议?范围v3似乎不是
- 是否有关于量程TS的文件?我发现的提案PDF几乎是一个格式糟糕的diff风格的代码转储。事实上,直接阅读cmcst2的来源对我来说更容易阅读。cppreference似乎也缺乏
std::vector
(或任何其他容器(的C++20方法是将范围的begin
和end
成员传递给接受2个迭代器(和一个可选分配器(的vector
构造函数。
我也在寻找这个问题的答案。我真正想要的是std::vector
的构造函数重载,接受一个范围。大约:
template <std::ranges::input_range R>
vector(R&& r) : vector(r.begin(), r.end()) {
}
但在C++20中没有。
首先,我实现了这个:
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()};
}
这是有效的,但不是很";rangy":https://godbolt.org/z/f2xAcd
然后我做得更好:
namespace detail {
// Type acts as a tag to find the correct operator| overload
template <typename C>
struct to_helper {
};
// This actually does the work
template <typename Container, rng::range R>
requires std::convertible_to<rng::range_value_t<R>, typename Container::value_type>
Container operator|(R&& r, to_helper<Container>) {
return Container{r.begin(), r.end()};
}
}
// Couldn't find an concept for container, however a
// container is a range, but not a view.
template <rng::range Container>
requires (!rng::view<Container>)
auto to() {
return detail::to_helper<Container>{};
}
https://godbolt.org/z/G8cEGqeq6
毫无疑问,对于sized_range
和像std::vector
这样具有reserve
成员函数的容器可以做得更好。
有人建议在C++23中添加一个to
函数(https://wg21.link/p1206)我相信这会做得更好。
相关文章:
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- std::vector的包装器,使数组的结构看起来像结构的数组
- 编译器如何区分std::vector的构造函数
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 为什么std::vector比数组慢
- std::vector::迭代器是否可以合法地作为指针
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 为什么std::vector和std::valarray初始化构造函数不同
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 在没有未定义行为的情况下实现类似std::vector的容器
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 如何将AERT_Allocate与 std:vector 一起使用
- 推导 std::vector::back() 的返回类型
- 如何将原始字节附加到 std::vector?
- std::vector 没有重载函数的实例与参数列表匹配
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?