2018年02月26日
《その311》 iterator_traits<>
iterator_traits<>クラステンプレート
iterator_traitsは、反復子から、その特性を取得するためのクラスです。
template <class Iterator>
struct iterator_traits {
typedef typename Iterator::iterator_category iterator_category;
typedef typename Iterator::value_type value_type;
typedef typename Iterator::difference_type difference_type;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::reference reference;
};
「反復子のカテゴリ」には
iterator_category
「2つの反復子が指す要素の差の型」には
difference_type
「反復子が指す要素の値の型」には
value_type
「ポインタ型」には
pointer
「参照型」には
reference
という typedef名が与えられているので、これを使って特性を取得することができます。
#include <vector>
#include <string>
#include <iostream>
using namespace std;
template<class InputIterator>
void disp(InputIterator first, InputIterator last) {
cout << " 〇 2つの反復子が指す要素の差の型\n";
cout << " "
<< typeid(
iterator_traits<InputIterator>::
difference_type
).name() << '\n';
cout << " 〇 反復子が指す要素の値の型\n";
cout << " "
<< typeid(
iterator_traits<InputIterator>::
value_type
).name() << '\n';
cout << " 〇 ポインタ型\n";
cout << " "
<< typeid(
iterator_traits<InputIterator>::
pointer
).name() << '\n';
cout << " 〇 参照型\n";
cout << " "
<< typeid(
iterator_traits<InputIterator>::
reference
).name() << '\n';
cout << " 〇 反復子のカテゴリ\n";
cout << " "
<< typeid(
iterator_traits<InputIterator>::
iterator_category
).name() << '\n';
}
int main() {
vector<int> a{ 1, 2, 3 };
vector<double> b{ 1.1, 2.2, 3.3 };
vector<char> c{ 'a', 'b', 'c' };
cout << "反復子の特性\n\n";
cout << "◆ vector<int>型オブジェクト\n\n";
disp(a.begin(), a.end()); cout << '\n';
cout << "◆ vector<double>型オブジェクト\n\n";
disp(b.begin(), b.end()); cout << '\n';
cout << "◆ vector<char>型オブジェクト\n\n";
disp(c.begin(), c.end()); cout;
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7366005
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック