c++ - 我们能够在 C++20 中构造带有 View 的容器吗?

标签 c++ c++20 range-v3

C++20 标准版本中的范围将引入 C++。

我的问题:我们是否能够构建任何范围的(现有)标准库容器?更重要的是,具有范围 View ?

例如,这样:

#include <vector>
#include <iostream>
#include <ranges>

int main() {
    auto sq = [](int x) { return x * x; };
    std::vector<int> vec { 3, 4, 5 };
    std::vector<int> squares { std::ranges::views::transform(vec, sq) };
    for(auto i : squares) { std::cout << i << ' '; }
    std::cout << std::endl;
}

是一个打印 9 16 25 的有效程序吗?

这个compiles with the ranges-v3 library ,这是值得的。

最佳答案

My question: Will we be able to construct (existing) standard-library containers with any range? And more importantly, with range views?

没有。唯一可从满足正确标准的任意范围构造的标准库组件是 std::span<T> .

标准库可能采用的方向是 range-v3 也朝着的方向(请注意,range-v3 中的链接示例确实可以编译,但会警告已弃用的转换) - 使用 a helper为您进行转换:

std::vector<int> squares =
    std::ranges::views::transform(vec, sq) | std::ranges::to<std::vector>;
<小时/>

不采用范围构造函数方向的原因之一可以从您使用的示例中看出:

std::vector<int> squares { std::ranges::views::transform(vec, sq) };

考虑一下该声明与这两个声明有何不同:

std::vector v { std::ranges::views::transform(vec, sq) };
std::vector w ( std::ranges::views::transform(vec, sq) );

v必然是 vector<transform_view<...>>包含单个transform_view ,而w将是 vector<int>

此外,向标准库添加更多、仔细约束的容器构造函数无论如何都不会帮助第三方容器类型 - 而像 ranges::to 这样的设施在所有情况下都工作得很好。

关于c++ - 我们能够在 C++20 中构造带有 View 的容器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59452296/

相关文章:

c++ - 获取 range-v3 vector 对的交集

c++ - STL或范围算法有效地找到满足谓词的n个连续元素

c++ - 为什么 ranges::single_view 对基础值使用大括号初始化?

c++ - 为什么数据类型的大小会随着操作系统的变化而变化?

c++ - 为什么不使用指针读取Struct?

c++ - 运算符如何重载|专门实现了 C++ 范围适配器?

C++20 协程 : need a function that uses co_yield

C++ vector 错误 C2036 : 'int (*)[]' : unknown size

c++ - Exiftool 获取图像信息

c++ - 如果 d > 255,为什么未指定 std::chrono::day 存储值