名稱空間
變體
操作

std::ranges::views::counted

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
定義於標頭檔案 <ranges>
inline constexpr /*unspecified*/ counted = /*unspecified*/;
(C++20 起)
呼叫簽名 (Call signature)
template< class Iterator, class DifferenceType >

    requires /* 見下文 */

constexpr /*span-or-subrange*/ counted( Iterator&& it, DifferenceType&& count );
(C++20 起)

一個 counted 視圖表示從迭代器 `i` 和非負整數 `n` 開始的 *計數值域* `[i, n)` 的元素 `view`

一個計數值域 `[i, n)` 是從 `i` 指向的元素開始,不包括(如果有的話)經過 `n` 次 ++i 操作後指向的元素的 `n` 個元素。

如果 n == 0,計數值域有效且為空。否則,計數值域只有在 `n` 為正數,`i` 可解引用,並且 `[++i, --n)` 是一個有效計數值域時才有效。

形式上,如果 itcount 是表示式,`T` 是 std::decay_t<decltype((it))>,且 `D` 是 std::iter_difference_t<T>,則:

如果 `T` 滿足 `input_or_output_iterator`decltype((count)) 滿足 std::convertible_to<D>
否則,views::counted(it, count) 是不合法的。

目錄

自定義點物件

名稱 `views::counted` 表示一個 *定製點物件*,它是一個常量 函式物件,型別為 字面 `semiregular` 類。為便於說明,其型別中 cv 不限定的版本表示為 `__counted_fn`。

`__counted_fn` 的所有例項都是相等的。在相同引數上呼叫 `__counted_fn` 型別的不同例項的效果是等價的,無論表示例項的表示式是左值還是右值,以及是否帶有 const 限定(然而,不要求可呼叫 volatile 限定的例項)。因此,`views::counted` 可以自由複製,並且其副本可以互換使用。

給定一組型別 `Args...`,如果 std::declval<Args>()... 滿足上面 `views::counted` 引數的要求,`__counted_fn` 模型為

否則,`__counted_fn` 的函式呼叫運算子不參與過載決議。

[編輯] 注意

`views::counted` 不檢查值域是否足夠長以提供所有 count 個元素:如果需要此檢查,請使用 views::take

[編輯] 示例

#include <iostream>
#include <ranges>
 
int main()
{
    const int a[]{1, 2, 3, 4, 5, 6, 7};
    for (int i : std::views::counted(a, 3))
        std::cout << i << ' ';
    std::cout << '\n';
 
    const auto il = {1, 2, 3, 4, 5};
    for (int i : std::views::counted(il.begin() + 1, 3))
        std::cout << i << ' ';
    std::cout << '\n';
}

輸出

1 2 3
2 3 4

[編輯] 缺陷報告

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

缺陷報告 應用於 釋出時的行為 正確的行為
P2393R1 C++20 從整數類型別到 std::size_t 的隱式轉換可能無效 改為 explicit

[編輯] 另請參閱

由另一個view的前N個元素組成的view
(類模板) (值域介面卡物件)[編輯]
將迭代器-哨兵對組合成view
(類模板) [編輯]
跟蹤到範圍末尾距離的迭代器介面卡
(類模板) [編輯]
返回滿足特定條件的元素數量
(演算法函式物件)[編輯]