名稱空間
變體
操作

std::ranges::views::elements, std::ranges::elements_view

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
 
定義於標頭檔案 <ranges>
template< ranges::input_range V, std::size_t N >

    requires ranges::view<V> &&
             /*has-tuple-element*/<ranges::range_value_t<V>, N> &&
             /*has-tuple-element*/<std::remove_reference_t<
                                       ranges::range_reference_t<V>>, N> &&
             /*returnable-element*/<ranges::range_reference_t<V>, N>
class elements_view

    : public ranges::view_interface<elements_view<V, N>>;
(1) (C++20 起)
namespace views {

    template< std::size_t N >
    constexpr /* unspecified */ elements = /* unspecified */;

}
(2) (C++20 起)
呼叫簽名 (Call signature)
template< ranges::viewable_range R >

    requires /* 見下文 */

constexpr ranges::view auto elements<N>( R&& r );
(C++20 起)
輔助概念
(3)
template< class T, std::size_t N >

concept /*has-tuple-element*/ =
    requires(T t) {
        typename std::tuple_size<T>::type;
        requires N < std::tuple_size_v<T>;
        typename std::tuple_element_t<N, T>;
        { std::get<N>(t) } -> std::convertible_to<
                                  const std::tuple_element_t<N, T>&>;

    };
(直至 C++23)
(僅作說明*)
template< class T, std::size_t N >

concept /*has-tuple-element*/ =

    /*tuple-like*/<T> && N < std::tuple_size_v<T>
(C++23 起)
(僅作說明*)
template< class T, std::size_t N >

concept returnable-element =
     std::is_reference_v<T> || std::move_constructible<

                                       std::tuple_element_t<N, T>>;
(4) (僅作說明*)
1) 接受一個元組類值的 view,並生成一個檢視,其值型別為適配檢視的值型別的第 N 個元素。
2) views::elements 的每個特化都是一個 RangeAdaptorObject。對於任何合適的子表示式 e 和常量表達式 M,表示式 views::elements<M>(e)表示式等價elements_view<views::all_t<decltype((e))>, M>{e}
3) 確保底層檢視的元素是元組類值,見 tuple-like(C++23 起)
4) 確保不會返回懸空引用。

當底層檢視 V 滿足相應的概念時,elements_view 滿足概念 random_access_rangebidirectional_rangeforward_rangeinput_rangecommon_rangesized_range

目錄

[編輯] 資料成員

成員名稱 (Member name) 定義
base_ (私有) 型別為 V 的底層(已適配)檢視
(僅用於闡釋的成員物件*)

[編輯] 成員函式

構造一個 elements_view
(public 成員函式) [編輯]
返回底層(適配)檢視的副本
(public 成員函式) [編輯]
返回指向起始的迭代器
(public 成員函式) [編輯]
返回一個迭代器或一個哨兵到末尾
(public 成員函式) [編輯]
返回元素數量,僅當底層(適配的)範圍滿足 sized_range 時提供
(public 成員函式) [編輯]
繼承自 std::ranges::view_interface
如果派生檢視滿足 sized_rangeforward_range,則返回派生檢視是否為空
(std::ranges::view_interface<D> 的 public 成員函式) [編輯]
(C++23)
返回範圍開頭的常量迭代器
(std::ranges::view_interface<D> 的 public 成員函式) [編輯]
(C++23)
返回範圍常量迭代器的哨兵
(std::ranges::view_interface<D> 的 public 成員函式) [編輯]
返回派生檢視是否非空,僅當 ranges::empty 適用於它時提供
(std::ranges::view_interface<D> 的 public 成員函式) [編輯]
返回派生檢視中的第一個元素,如果它滿足 forward_range 則提供
(std::ranges::view_interface<D> 的 public 成員函式) [編輯]
如果派生檢視滿足 bidirectional_rangecommon_range,則返回派生檢視中的最後一個元素
(std::ranges::view_interface<D> 的 public 成員函式) [編輯]
返回派生檢視中的第 n 個元素,僅當它滿足 random_access_range 時提供
(std::ranges::view_interface<D> 的 public 成員函式) [編輯]

[編輯] 巢狀類

迭代器型別
(僅用於說明的成員類模板*)
哨兵型別
(僅用於說明的成員類模板*)

[編輯] 輔助模板

template<class T, std::size_t N>

constexpr bool enable_borrowed_range<std::ranges::elements_view<T, N>> =

    ranges::enable_borrowed_range<T>;
(C++20 起)

ranges::enable_borrowed_range 的特化使得 elements_view 在底層檢視滿足 borrowed_range 時也滿足該概念。

[編輯] 示例

#include <iostream>
#include <ranges>
#include <string>
#include <tuple>
#include <vector>
 
int main()
{
    const std::vector<std::tuple<int, char, std::string>> vt
    {
        {1, 'A', "α"},
        {2, 'B', "β"},
        {3, 'C', "γ"},
        {4, 'D', "δ"},
        {5, 'E', "ε"},
    };
 
    for (int const e : std::views::elements<0>(vt))
        std::cout << e << ' ';
    std::cout << '\n';
 
    for (char const e : vt | std::views::elements<1>)
        std::cout << e << ' ';
    std::cout << '\n';
 
    for (std::string const& e : std::views::elements<2>(vt))
        std::cout << e << ' ';
    std::cout << '\n';
}

輸出

1 2 3 4 5
A B C D E
α β γ δ ε

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 3494 C++20 elements_view 從未是 borrowed_range 它是 borrowed_range
如果其底層檢視是
LWG 3502 C++20 elements_view 可能會獲得懸空引用 禁止此類用法

[編輯] 參閱

接受一個由類似對的值組成的view,並生成一個由每對的第一個元素組成的view
(類模板) (range 介面卡物件)[編輯]
接受一個由類似對的值組成的view,並生成一個由每對的第二個元素組成的view
(類模板) (range 介面卡物件)[編輯]
一個由引用到適配檢視對應元素的元組組成的 view
(類模板) (定製點物件)[編輯]
一個由轉換函式應用於適配檢視中對應元素的結果組成的 view
(類模板) (定製點物件)[編輯]
valarray 的類 BLAS 切片:起始索引、長度、步長
(類) [編輯]