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) 范围适配器对象。表达式 views::keys(e) 表达式对任何适合的子表达式 e 表达式等价于 keys_view<views::all_t<decltype((e))>>{e} 。
表达式等价
表达式 e 表达式等价于表达式 f ,若 e 与 f 拥有相同效果,均为潜在抛出或均非潜在抛出(即 noexcept(e) == noexcept(f) ),且均为常量子表达式或均非常量子表达式。
注解
keys_view
能用于从关联容器提取键,例如 for (auto const& key : std::views::keys(map)) { /*...*/ } 。
示例
运行此代码
#include <iomanip> #include <iostream> #include <ranges> #include <utility> #include <vector> int main() { const std::vector<std::pair<std::string, double>> quark_mass{ // MeV/c² {"up", 2.3}, {"down", 4.8}, {"charm", 1275}, {"strange", 95}, {"top", 173'210}, {"bottom", 4'180}, }; std::cout << "quark name: │ "; for (std::string const& name : std::views::keys(quark_mass)) std::cout << std::setw(9) << name << " │ "; std::cout << "\n" "mass MeV/c²: │ "; for (const double mass : std::views::values(quark_mass)) std::cout << std::setw(9) << mass << " │ "; std::cout << '\n'; }
输出:
quark name: │ up │ down │ charm │ strange │ top │ bottom │ mass MeV/c²: │ 2.3 │ 4.8 │ 1275 │ 95 │ 173210 │ 4180 │
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 3563 | C++20 | keys_view 由于使用 views::all_t 无法参与 CTAD
|
移除 views::all_t |
参阅
选取 pair 式值组成的 view 并产生每个 pair 的第二元素的 view (类模板) (范围适配器对象) | |
选取 tuple-like 值组成的 view 和数值 N,产生每个 tuple 的第 N 个元素的 view (类模板) (范围适配器对象) | |
valarray 的 BLAS 式切片:起始下标、长度、跨度 (类) |