std::ranges::views::keys, std::ranges::keys_view
来自cppreference.com
在标头 <ranges> 定义
|
||
template< class R > using keys_view = ranges::elements_view<R, 0>; |
(1) | (C++20 起) |
namespace views { inline constexpr auto keys = ranges::elements<0>; |
(2) | (C++20 起) |
接收元组式值(例如 std::tuple 或 std::pair)的 view
,并产生一个视图,其值类型为被适配的视图的值类型的第一个元素。
1) ranges::elements_view<R, 0> 的别名。
2) 范围适配器对象 (RangeAdaptorObject) (也是 范围适配器闭包对象 (RangeAdaptorClosureObject) )。对任何适合的子表达式 e,表达式 views::keys(e) 表达式等价于 keys_view<views::all_t<decltype((e))>>{e}。
注解
keys_view 能用于从关联容器提取键,例如
std::map<std::string, int> map{{"one", 1}, {"two", 2}}; for (auto const& key : std::views::keys(map)) std::cout << key << ' '; // 打印:one two
示例
显示粒子物理中每种 夸克 类型的值。
运行此代码
#include <iomanip> #include <iostream> #include <locale> #include <ranges> #include <string> #include <tuple> #include <vector> int main() { const std::vector<std::tuple<std::string, double, bool>> quark_mass_charge { // 名字,MeV/c²,具有正电荷: {"上", 2.3, true}, {"下", 4.8, false}, {"粲", 1275, true}, {"奇异", 95, false}, {"顶", 173'210, true}, {"底", 4'180, false}, }; std::cout.imbue(std::locale("en_US.utf8")); std::cout << "夸克名称: │ "; for (std::string const& name : std::views::keys(quark_mass_charge)) std::cout << std::setw(9) << name << " │ "; std::cout << "\n" "质量 MeV/c²: │ "; for (const double mass : std::views::values(quark_mass_charge)) std::cout << std::setw(9) << mass << " │ "; std::cout << "\n" "电荷: │ "; for (const bool pos : std::views::elements<2>(quark_mass_charge)) std::cout << std::setw(9) << (pos ? "+2/3" : "-1/3") << " │ "; std::cout << '\n'; }
输出:
夸克名称: │ 上 │ 下 │ 粲 │ 奇异 │ 顶 │ 底 │ 质量 MeV/c²: │ 2.3 │ 4.8 │ 1,275 │ 95 │ 173,210 │ 4,180 │ 电荷: │ +2/3 │ -1/3 │ +2/3 │ -1/3 │ +2/3 │ -1/3 │
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 3563 | C++20 | keys_view 由于使用 views::all_t 无法参与 CTAD
|
移除 views::all_t |
参阅
接受一个由对偶式值组成的 view 并产生每个对偶的第二元素组成的 view (类模板) (范围适配器对象) | |
选取 tuple-like 值组成的 view 和数值 N,产生每个元组的第 N 个元素组成的 view (类模板) (范围适配器对象) | |
valarray 的 BLAS 式切片:起始下标、长度、跨度 (类) |