std::iterator_traits
來自 cppreference.com
< cpp | 迭代器 (iterator)
定義於標頭檔案 <iterator> |
||
template< class Iter > struct iterator_traits; |
||
template< class T > struct iterator_traits<T*>; |
||
template< class T > struct iterator_traits<const T*>; |
(C++20 中移除) | |
std::iterator_traits
是型別特徵類,它為 LegacyIterator 型別的屬性提供統一介面。這使得僅透過迭代器實現演算法成為可能。
該模板可以針對使用者定義的迭代器進行特化,以便即使型別不提供常用 typedef,也可以檢索有關迭代器的資訊。
使用者特化可以將其巢狀型別 |
(C++20 起) |
目錄 |
[編輯] 模板引數
Iter | - | 要檢索屬性的迭代器型別 |
[編輯] 成員型別
巢狀型別 | 定義 |
difference_type
|
Iter::difference_type
|
value_type
|
Iter::value_type
|
pointer
|
Iter::pointer
|
reference
|
Iter::reference
|
iterator_category
|
Iter::iterator_category
|
如果 |
(C++17 起) (C++20 前) | ||||||||||||||||||||||||||||||||||||
如果
否則,此模板不包含任何具有這些名稱的成員( |
(C++20 起) |
[編輯] 特化
此型別特徵可以針對可作為迭代器使用的使用者提供型別進行特化。標準庫為指標型別 T*
提供部分特化,這使得可以使用原始指標的所有基於迭代器的演算法。
標準庫還為某些標準迭代器介面卡提供部分特化。 |
(C++20 起) |
[編輯] T*
特化巢狀型別
僅當 std::is_object_v<T> 為 true 時才進行特化。 |
(C++20 起) |
巢狀型別 | 定義 |
difference_type
|
std::ptrdiff_t |
value_type
|
T (直到 C++20)std::remove_cv_t<T>(自 C++20 起) |
pointer
|
T*
|
reference
|
T&
|
iterator_category
|
std::random_access_iterator_tag |
iterator_concept (自 C++20 起) |
std::contiguous_iterator_tag |
const T* 特化巢狀型別
|
(C++20 前) |
[編輯] 庫型別的特化
為 std::common_iterator 型別的屬性提供統一介面 (類模板特化) | |
為 std::counted_iterator 型別的屬性提供統一介面 (類模板特化) |
[編輯] 示例
顯示了雙向迭代器的通用 std::reverse() 實現。
執行此程式碼
#include <iostream> #include <iterator> #include <list> #include <vector> template<class BidirIt> void my_reverse(BidirIt first, BidirIt last) { typename std::iterator_traits<BidirIt>::difference_type n = std::distance(first, last); for (--n; n > 0; n -= 2) { typename std::iterator_traits<BidirIt>::value_type tmp = *first; *first++ = *--last; *last = tmp; } } int main() { std::vector<int> v{1, 2, 3, 4, 5}; my_reverse(v.begin(), v.end()); for (int n : v) std::cout << n << ' '; std::cout << '\n'; std::list<int> l{1, 2, 3, 4, 5}; my_reverse(l.begin(), l.end()); for (int n : l) std::cout << n << ' '; std::cout << '\n'; int a[]{1, 2, 3, 4, 5}; my_reverse(a, a + std::size(a)); for (int n : a) std::cout << n << ' '; std::cout << '\n'; // std::istreambuf_iterator<char> i1(std::cin), i2; // my_reverse(i1, i2); // compilation error: i1, i2 are input iterators }
輸出
5 4 3 2 1 5 4 3 2 1 5 4 3 2 1
[編輯] 另請參閱
(C++17 中已棄用) |
基類,用於簡化簡單迭代器所需型別的定義 (類模板) |
用於指示迭代器類別的空類型別 (類) | |
(C++20)(C++20)(C++23)(C++20)(C++20)(C++20) |
計算迭代器的關聯型別 (別名模板) |