std::ranges::views::enumerate, std::ranges::enumerate_view
來自 cppreference.com
定義於標頭檔案 <ranges> |
||
template< ranges::view V > requires /*range-with-movable-references*/<V> |
(1) | (C++23 起) |
namespace views { inline constexpr /* unspecified */ enumerate = /* unspecified */; |
(2) | (C++23 起) |
呼叫簽名 (Call signature) |
||
template< ranges::viewable_range R > requires /* 見下文 */ |
(C++23 起) | |
輔助概念 |
||
template< class R > concept /*range-with-movable-references*/ = |
(3) | (僅作說明*) |
1)
enumerate_view
是一個範圍介面卡,它接受一個 view
並生成一個元組檢視。結果序列的第 i
個元素(即元組)包含:- 等於
i
的值,它是底層序列元素的從零開始的索引,以及 - 底層元素的引用。
2) 名稱
views::enumerate
表示一個 範圍介面卡物件。給定子表示式 e,表示式 views::enumerate(e) 在 表示式上等價於 enumerate_view<views::all_t<decltype((e))>>(e) 對於任何合適的子表示式 e。3) 確保底層型別的引用型別可以移動。
當底層檢視 V
滿足相應的概念時,enumerate_view
模擬 random_access_range
、bidirectional_range
、forward_range
、input_range
、common_range
和 sized_range
等概念。
目錄 |
[編輯] 資料成員
成員名稱 (Member name) | 定義 |
base_ (私有) |
底層型別 V 序列的迭代器。(僅用於闡釋的成員物件*) |
[編輯] 成員函式
構造一個 enumerate_view (public 成員函式) | |
返回底層(適配)檢視的副本 (public 成員函式) | |
返回指向起始的迭代器 (public 成員函式) | |
返回一個迭代器或一個哨兵到末尾 (public 成員函式) | |
返回元素數量,僅當底層(適配的)範圍滿足 sized_range 時提供(public 成員函式) | |
繼承自 std::ranges::view_interface | |
返回派生檢視是否為空,僅當其滿足 sized_range 或 forward_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_range 和 common_range 時提供( std::ranges::view_interface<D> 的 public 成員函式) | |
返回派生檢視中的第 n 個元素,僅當它滿足 random_access_range 時提供( std::ranges::view_interface<D> 的 public 成員函式) |
[編輯] 推導指南
[編輯] 巢狀類
(C++23) |
迭代器型別 (僅用於說明的成員類模板*) |
(C++23) |
哨兵型別 (僅用於說明的成員類模板*) |
[編輯] 輔助模板
template< class View > constexpr bool enable_borrowed_range<ranges::enumerate_view<View>> = |
(C++23 起) | |
當底層檢視滿足 borrowed_range
時,此 ranges::enable_borrowed_range 特化使 enumerate_view
滿足 borrowed_range
。
[編輯] 注意
特性測試宏 | 值 | 標準 | 特性 |
---|---|---|---|
__cpp_lib_ranges_enumerate |
202302L |
(C++23) | std::ranges::enumerate_view
|
[編輯] 示例
執行此程式碼
#include <iostream> #include <map> #include <ranges> #include <vector> int main() { constexpr static auto v = {'A', 'B', 'C', 'D'}; for (auto const [index, letter] : std::views::enumerate(v)) std::cout << '(' << index << ':' << letter << ") "; std::cout << '\n'; #if __cpp_lib_ranges_to_container // create a map using the position of each element as key auto m = v | std::views::enumerate | std::ranges::to<std::map>(); for (auto const [key, value] : m) std::cout << '[' << key << "]:" << value << ' '; std::cout << '\n'; #endif std::vector<int> numbers{1, 3, 5, 7}; // num is mutable even with const, which does not propagate to reference to // make it const, use `std::views::enumerate(numbers) | std::views::as_const` // or `std::views::enumerate(std::as_const(numbers))` for (auto const [index, num] : std::views::enumerate(numbers)) { ++num; // the type is int& std::cout << numbers[index] << ' '; } std::cout << '\n'; }
可能的輸出
(0:A) (1:B) (2:C) (3:D) [0]:A [1]:B [2]:C [3]:D 2 4 6 8
[編輯] 參考資料
- C++23 標準 (ISO/IEC 14882:2024)
- 26.7.23 Enumerate view [range.enumerate]
[編輯] 另請參閱
(C++20) |
由重複遞增初始值生成的序列組成的 view (類模板) (定製點物件) |
(C++23) |
一個由引用到適配檢視對應元素的元組組成的 view (類模板) (定製點物件) |
接受一個由 類元組 值組成的 view 和一個數字 N,並生成一個由每個元組的第 N 個元素組成的 view (類模板) (範圍介面卡物件) |