名稱空間
變體
操作

std::ranges::subrange

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
檢視
subrange

範圍介面卡 (Range adaptors)
 
 
定義於標頭檔案 <ranges>
template<

    std::input_or_output_iterator I,
    std::sentinel_for<I> S = I,
    ranges::subrange_kind K = std::sized_sentinel_for<S, I> ?
                                  ranges::subrange_kind::sized :
                                  ranges::subrange_kind::unsized
>
    requires (K == ranges::subrange_kind::sized ||
                 !std::sized_sentinel_for<S, I>)
class subrange

    : public ranges::view_interface<subrange<I, S, K>>
(1) (C++20 起)
輔助概念
template<class From, class To>

concept /*uses-nonqualification-pointer-conversion*/ =

    /* see description */;
(2) (僅作說明*)
template<class From, class To>
concept /*convertible-to-non-slicing*/ = /* see description */;
(3) (僅作說明*)
1) `subrange` 類模板將迭代器和哨兵組合成一個 `view`。當最終模板引數為 `subrange_kind::sized`(當 std::sized_sentinel_for<S, I> 滿足或當大小作為建構函式引數顯式傳遞時)時,它建模 `sized_range`
2) 確定 `From` 是否可以在不進行限定符轉換的情況下轉換為 `To`。等同於
template<class From, class To>
concept /*uses-nonqualification-pointer-conversion*/ =
    std::is_pointer_v<From> && std::is_pointer_v<To> &&
        !std::convertible_to<std::remove_pointer_t<From>(*)[],
                             std::remove_pointer_t<To>(*)[]>;
3) 確定 `From` 是否可以在不進行派生類到基類轉換的情況下轉換為 `To`
template<class From, class To>
concept /*convertible-to-non-slicing*/ =
    std::convertible_to<From, To> &&
        !/*uses-nonqualification-pointer-conversion*/
            <std::decay_t<From>, std::decay_t<To>>;

目錄

[編輯] 資料成員

成員 定義
constexpr bool StoreSize [static] K == ranges::subrange_kind::sized &&
    !std::sized_sentinel_for<S, I>

僅用於解釋的靜態成員常量*
I begin_ 子範圍的起始迭代器
(僅用於闡釋的成員物件*)
S end_ 表示子範圍結束的哨兵
(僅用於闡釋的成員物件*)
make-unsigned-like-t <std::iter_difference_t<I>> size_
(僅當 `StoreSize` 為 true 時存在)
子範圍的大小
(僅用於闡釋的成員物件*)

[編輯] 成員函式

建立新的 `subrange`
(公開成員函式)
將 `subrange` 轉換為 pair-like 型別
(public member function) [編輯]
觀察器
獲取迭代器
(public member function) [編輯]
獲取哨兵
(public member function) [編輯]
檢查 `subrange` 是否為空
(public member function) [編輯]
獲取 `subrange` 的大小
(public member function) [編輯]
迭代器操作
將迭代器按給定距離前進
(public member function) [編輯]
獲取 `subrange` 的副本,其迭代器按給定距離遞減
(public member function) [編輯]
獲取 `subrange` 的副本,其迭代器按給定距離前進
(public member function) [編輯]
繼承自 std::ranges::view_interface
(C++23)
返回範圍開頭的常量迭代器
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
(C++23)
返回範圍常量迭代器的哨兵
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視是否非空,僅當 ranges::empty 適用於它時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
獲取派生檢視資料地址,僅當其迭代器型別滿足 contiguous_iterator 時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視中的第一個元素,如果它滿足 forward_range 則提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視的最後一個元素,僅當它滿足 `bidirectional_range``common_range` 時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視中的第 n 個元素,僅當它滿足 random_access_range 時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]

[編輯] 推導指南

[編輯] 非成員函式

std::ranges::subrange 獲取迭代器或哨兵
(函式模板) [編輯]

[編輯] 輔助型別

指定 std::ranges::subrange 是否建模 std::ranges::sized_range
(列舉) [編輯]
獲取 std::ranges::subrange 的大小
(類模板特化) [編輯]
獲取 std::ranges::subrange 的迭代器或哨兵的型別
(類模板特化) [編輯]

[編輯] 輔助模板

template< class I, class S, ranges::subrange_kind K >
constexpr bool ranges::enable_borrowed_range<ranges::subrange<I, S, K>> = true;
(C++20 起)

這個 ranges::enable_borrowed_range 的特化使得 `subrange` 滿足 `borrowed_range`

[編輯] 示例

#include <map>
#include <print>
#include <ranges>
 
void make_uppercase(char& v)
{
    v += 'A' - 'a';
}
 
void uppercase_transform(std::multimap<int, char>& m, int k)
{
    auto [first, last] = m.equal_range(k);
    for (auto& [_, v] : std::ranges::subrange(first, last))
        make_uppercase(v);
}
 
int main()
{
    std::multimap<int, char> mm{{4, 'a'}, {3, '-'}, {4, 'b'}, {5, '-'}, {4, 'c'}};
    std::println("Before: {}", mm);
    uppercase_transform(mm, 4);
    std::println("After:  {}", mm);
}

輸出

Before: {3: '-', 4: 'a', 4: 'b', 4: 'c', 5: '-'}
After:  {3: '-', 4: 'A', 4: 'B', 4: 'C', 5: '-'}

[編輯] 缺陷報告

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

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 3470 C++20 `convertible-to-non-slicing` 可能會拒絕限定符轉換 總是接受它們

[編輯] 另請參閱

用於使用奇異遞迴模板模式定義view的輔助類模板
(類模板) [編輯]

[編輯] 外部連結

在 C++20 中讀取/寫入 `std::multimap` 中給定鍵的所有值 — Stack Overflow