# std::ranges::views::values, std::ranges::values_view

< cpp‎ | ranges

定义于头文件 `<ranges>` |  |
template<class R> using values_view = ranges::elements_view<R, 1>; | (1) | (C++20 起)
namespace views { inline constexpr auto values = ranges::elements<1>; } | (2) | (C++20 起)

接收元组式值（例如 std::tuple 或 std::pair ）的 `view` ，并产生值类型为被适配的视图的值的第二个元素的视图。

1) ranges::elements_view<R, 1> 的别名。
2) 范围适配器对象。表达式 views​::values(e) 表达式对任何适合的子表达式 e 表达式等价于 values_view<views​::​all_t<decltype((e))>>{e} 。

### 表达式等价

表达式 e 表达式等价于表达式 f ，若 e 与 f 拥有相同效果，均为潜在抛出或均非潜在抛出（即 noexcept(e) == noexcept(f) ），且均为常量子表达式或均非常量子表达式。

### 注解

`values_view` 能用于从关联容器提取值，例如 for (auto const& value : std::views::values(map)) { /*...*/ } 。

### 示例

    #include <iostream>
    #include <ranges>
    #include <map>

    int main()
    {
        std::map<char, int> map{ {'A', 1}, {'B', 2}, {'C', 3}, {'D', 4}, {'E', 5} };

        auto odd = [](int x) { return 0 != (x & 1); };

        std::cout << "Odd values in the map: ";
        for (int value : map | std::views::values | std::views::filter(odd))
            std::cout << value << ' ';
    }

输出：

    Odd values in the map: 1 3 5

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 3563 | C++20 | `values_view` 由于使用 views::all_t 无法参与 CTAD | 移除 views::all_t

### 参阅

ranges::keys_view views::keys (C++20) | 选取 pair 式值组成的 `view` 并产生每个 pair 的第一元素的 `view` (类模板) (范围适配器对象)
ranges::elements_view views::elements (C++20) | 选取元组式值组成的 `view` 和数值 N ，产生每个 tuple 的第 N 个元素的 `view` (类模板) (范围适配器对象)
slice | valarray 的 BLAS 式切片：起始下标、长度、跨度 (类)