Will we be able to construct containers with views in C++20?(我们能用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_view
的vector<transform_view<...>>
,而w
将是vector<int>
。
ranges::to
这样的工具在所有情况下都能很好地工作。
这篇关于我们能用C++20构建带有视图的容器吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:我们能用C++20构建带有视图的容器吗?
基础教程推荐
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17