STLコンポーネント
コンテナ vectorとか 汎用アルゴリズム #include 反復子 iterator vector ::iterator the_iterator; 関数オブジェクト #inculude アダプタ vector ::reverse_iterator rit 割り当て子 allocator
イテレータのカテゴリ | 内容 | 提供元 | 使える演算子 |
---|---|---|---|
input_iterator(入力反復子) InputIterator | 前方向に値を読み込む。イテレータ自身はインクリメント、比較、逆参照可能。 | istream | a == b a != b *a a->m |
output_iterator(出力反復子) OutputIterator | 前方向に値を書き込む。イテレータ自身はインクリメント、比較、逆参照可能。 | ostream, inserter | *a = t *a++ = t |
forward_iterator(前方向反復子) ForwardIterator | 前方向に値を読み書きする。これはinputイテレータとoutputoイテレータの機能を合わせたものにイテレータの値を格納する機能を追加したものである。 | X a; X() | |
bidirectional_iterator | 前後方向に値を読み書きする。forwardイテレータと似ているが、インクリメントもデクリメントもできる。 | list, map, multimap, set, multiset | --a a-- *a-- |
random_access_iterator RandonAccessIterator | ランダムアクセスで読み書きする。もっとも強力なイテレータで、両方向イテレータにポインタの演算とポインタの比較の機能を追加したものである。a + n n + a n - a a - b Supports inequality comparisons (<, >, <= and >=) between iterators a < b a > b a <= b a >= b Supports compound assignment operations += and -= a += n a -= n Supports offset dereference operator ([]) a[n] | array, deque, string, vector |
Predefined iterators
reverse_iterator Reverse iterator (class template)
Inserter iterators
back_insert_iterator Back insert iterator (class template) front_insert_iterator Front insert iterator (class template) insert_iterator Insert iterator (class template)
定数反復子 vector
対可変反復子 vector
読み取りならば、借引数のときにconstを指定した方が良い.
const vectorvector2(100, 0) //Initalization //vector ::iterator i = vector2.begin(); vector ::const_iterator i = vector2.begin();
コンテナが提供する反復子タイプ
T a[n] | T* | 可変ランダムアクセス |
T a[n] | const T* | 定数ランダムアクセス |
vector<T> | vector<T>::iterator | 可変ランダムアクセス |
vector<T> | vector<T>::const_iterator | 定数ランダムアクセス |
deque<T> | deque<T>::iterator | 可変ランダムアクセス |
deque<T> | deque<T>::const_iterator | 定数ランダムアクセス |
list<T> | list<T>::iterator | 可変双方向 |
list<T> | list<T>::const_iterator | 定数双方向 |
set<T> | set<T>::iterator | 定数双方向 |
set<T> | set<T>::const_iterator | 定数双方向 |
multiset<T> | multiset<T>::iterator | 定数双方向 |
multiset<T> | multiset<T>::const_iterator | 定数双方向 |
map<Key, T> | map<Key, T>::iterator | 可変双方向 |
map<Key, T> | map<Key, T>::const_iterator | 定数双方向 |
multimap<Key, T> | multimap<Key, T>::iterator | 可変双方向 |
multimap<Key, T> | multimap<Key, T>::const_iterator | 定数双方向 |
setとmultisetのiteratorが可変でないのは, 格納されているキーを変更するための唯一の方法がキーを削除してから別のキーを挿入するというものだから.
直接値を入れるようなことをすれば正常な順序が保てなくなるので,できないようになっている.
補足その1
元々、イテレータはポインタとそっくりに定義されているので、 たとえば、ヘッダ内の関数はSTL以外、すなわち、ただの関数でも使用可能。 よく見かけるのがfill #include void fill( forward_iterator start, forward_iterator end, const T& val ); int dp[row][col]; fill(dp[0], dp[0]+row*col, INF); dp[0] はint*型なので、イテレータと同じように使える。 //fill(dp, dp*row*col, INF)はだめ。 //後使いそうなのが、max_elementとかかな? //findも便利そうではある。 count(flag[0], flag[0]+row*col, false); //falseの数を調べる。
- -
//iter_swaptemplate void iter_swap ( ForwardIterator1 a, ForwardIterator2 b ); //要素自体をいれかえる。 // advance, distanceのつかいかた。 distanceはset, map, list方面で便利. //lower~upperまでの範囲の個数を求める関数. return (int)distance(validNum.lower_bound(lower), validNum.upper_bound(upper) ); template void advance (InputIterator& i, Distance n); typename iterator_traits ::difference_type distance (InputIterator first, InputIterator last);