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*
に対して部分特殊化を提供しており、これにより生ポインタをすべてのイテレータベースのアルゴリズムで使用できるようになります。
|
標準ライブラリはまた、一部の標準イテレータアダプタに対する部分特殊化も提供します。 |
(since 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)
|
イテレータの関連型を計算する
(エイリアステンプレート) |