我们能用C++20构建带有视图的容器吗? [英] Will we be able to construct containers with views in C++20?

查看:30
本文介绍了我们能用C++20构建带有视图的容器吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Range即将使用C++20标准版本。

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

例如,这是否会:

#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,这是值得的。

推荐答案

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

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

标准库可能遵循的方向也是Range-v3的方向(请注意,Range-v3中的链接示例确实会编译,但会对不推荐使用的转换发出警告)-使用a helper为您执行转换:

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

不使用Range构造函数的原因之一可以从您正在使用的示例中看出:

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必须是包含单个transform_viewvector<transform_view<...>>,而w将是vector<int>

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

这篇关于我们能用C++20构建带有视图的容器吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆