std::ranges::views::counted
定義於標頭檔案 <ranges> |
||
inline constexpr /*unspecified*/ counted = /*unspecified*/; |
(C++20 起) | |
呼叫簽名 (Call signature) |
||
template< class Iterator, class DifferenceType > requires /* 見下文 */ |
(C++20 起) | |
一個 counted 視圖表示從迭代器 `i` 和非負整數 `n` 開始的 *計數值域* `[i, n)` 的元素 `view`。
一個計數值域 `[i, n)` 是從 `i` 指向的元素開始,不包括(如果有的話)經過 `n` 次 ++i 操作後指向的元素的 `n` 個元素。
如果 n == 0,計數值域有效且為空。否則,計數值域只有在 `n` 為正數,`i` 可解引用,並且 `[++i, --n)` 是一個有效計數值域時才有效。
形式上,如果 it 和 count 是表示式,`T` 是 std::decay_t<decltype((it))>,且 `D` 是 std::iter_difference_t<T>,則:
- 如果 `T` 滿足 `input_or_output_iterator` 且 decltype((count)) 滿足 std::convertible_to<D>,
- 如果 `T` 滿足 `contiguous_iterator`,則 views::counted(it, count) 表示式等價於 std::span(std::to_address(it), static_cast<std::size_t>(static_cast<D>(count))),
- 否則,如果 `T` 滿足 `random_access_iterator`,則 views::counted(it, count) 表示式等價於 ranges::subrange(it, it + static_cast<D>(count)),
- 否則,views::counted(it, count) 表示式等價於 ranges::subrange(std::counted_iterator(it, count), std::default_sentinel)。
- 否則,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` 模型為
- std::invocable<__counted_fn, Args...>,
- std::invocable<const __counted_fn, Args...>,
- std::invocable<__counted_fn&, Args...>,和
- std::invocable<const __counted_fn&, Args...>.
否則,`__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 |
[編輯] 另請參閱
(C++20) |
由另一個view 的前N個元素組成的view (類模板) (值域介面卡物件) |
(C++20) |
將迭代器-哨兵對組合成view (類模板) |
(C++20) |
跟蹤到範圍末尾距離的迭代器介面卡 (類模板) |
(C++20)(C++20) |
返回滿足特定條件的元素數量 (演算法函式物件) |