std::iterator_traits
| ヘッダ <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) |
イテレータの関連型を計算する (エイリアステンプレート) |