slist<T, Alloc> リファレンス
※ slist<T,Alloc>はSGI版STLが提供するコンテナクラスであり、標準C++ライブラリには含まれていません。
しかしながらこのSGI版STLは大元のHPのリファレンス実装の直系で、STLportなど様々なSTL実装のベースとなっていることから、事実上の標準といっても差支えないものです。gccもこのSGI版STL(もしくはSTLport)を採用しています。
slist
は単方向リンクリストです。slist
内の各要素は次の要素へのリンクを持っていますが、双方向リンクリスト:std::list
のように前の要素へのリンクを持ってはいません。
したがって、(std::list
のイテレータが双方向イテレータであるのに対し)slist
のイテレータは ‘前方向イテレータ’ であり、イテレータの指す位置を遡ることはできません(operator–()を持っていません)。
また、前の要素へのリンクを持たないことから、std::list
にある末尾に対する参照/追加/削除メソッド back
/ push_back
/ pop_back
をサポートしていません。
slist
はstd::list
に比べて機能的には劣ります。が、双方向イテレータを必要としない用途であれば、管理しなければならないリンクが単方向で済むため、std::list
より若干ながらコンパクトかつ高速です。
標準C++が定めるコンテナの要求を満たすため、slist
にはstd::list
と同等のメソッドが実装されています。
しかしながら前の要素へのリンクを持たないため、inssert
やerase
はstd::list
よりかなり低速(要素数に比例)であることに留意してください。代替メソッドとして、定数時間で処理を行なうinsert_after
, erase_after
が用意されています。 できる限りこれらをお使いください。
サンプル
#include <slist> #include <iostream> #include <algorithm> using namespace std; int main() { slist<int> L; L.push_front(0); L.push_front(1); L.insert_after(L.begin(), 2); copy(L.begin(), L.end(), // 出力: 1 2 0 ostream_iterator<int>(cout, " ")); cout << endl; slist<int>::iterator back = L.previous(L.end()); back = L.insert_after(back, 3); back = L.insert_after(back, 4); back = L.insert_after(back, 5); copy(L.begin(), L.end(), // 出力: 1 2 0 3 4 5 ostream_iterator<int>(cout, " ")); cout << endl; return 0; }
<slist>
/* * このヘッダは STLport-4.5-01119 を基に作成されたものであり、 * SGIオリジナル(後述のメソッド一覧)と完全には一致していません */ template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) > class slist : protected _Slist_base<_Tp,_Alloc> { public: typedef _Tp value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef forward_iterator_tag _Iterator_category; typedef _Slist_iterator<_Tp, _Nonconst_traits<_Tp> > iterator; typedef _Slist_iterator<_Tp, _Const_traits<_Tp> > const_iterator; _STLP_FORCE_ALLOCATORS(_Tp, _Alloc) typedef typename _Base::allocator_type allocator_type; public: allocator_type get_allocator() const; explicit slist(const allocator_type& __a = allocator_type()); slist(size_type __n, const value_type& __x, const allocator_type& __a = allocator_type()); explicit slist(size_type __n); template <class _InputIterator> slist(_InputIterator __first, _InputIterator __last, const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL); slist(const _Self& __x); _Self& operator= (const _Self& __x); ~slist() {} void assign(size_type __n, const _Tp& __val); template <class _InputIterator> void assign(_InputIterator __first, _InputIterator __last); iterator before_begin(); const_iterator before_begin() const; iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; size_type size() const; size_type max_size() const; bool empty() const; void swap(_Self& __x); reference front(); const_reference front() const; void push_front(); void pop_front(); iterator previous(const_iterator __pos); const_iterator previous(const_iterator __pos) const; iterator insert_after(iterator __pos, const value_type& __x); iterator insert_after(iterator __pos); void insert_after(iterator __pos, size_type __n, const value_type& __x); template <class _InIter> void insert_after(iterator __pos, _InIter __first, _InIter __last); iterator insert(iterator __pos, const value_type& __x); iterator insert(iterator __pos); void insert(iterator __pos, size_type __n, const value_type& __x); template <class _InIter> void insert(iterator __pos, _InIter __first, _InIter __last); iterator erase_after(iterator __pos); iterator erase(iterator __pos); iterator erase(iterator __first, iterator __last); void resize(size_type new_size, const _Tp& __x); void resize(size_type new_size); void clear(); void splice_after(iterator __pos, iterator __before_first, iterator __before_last); void splice_after(iterator __pos, iterator __prev); void splice_after(iterator __pos, _Self& __x); void splice(iterator __pos, _Self& __x); void splice(iterator __pos, _Self& __x, iterator __i); void splice(iterator __pos, _Self& __x, iterator __first, iterator __last); void reverse(); void remove(const _Tp& __val); void unique(); void merge(_Self& __x); void sort(); template <class _Predicate> void remove_if(_Predicate __pred); template <class _BinaryPredicate> void unique(_BinaryPredicate __pred); template <class _StrictWeakOrdering> void merge(slist<_Tp,_Alloc>& __x, _StrictWeakOrdering __comp); template <class _StrictWeakOrdering> void sort(_StrictWeakOrdering __comp); };
メソッド一覧
iterator begin() |
slist の先頭要素を指すiterator を返します。 |
iterator end() |
slist の末尾要素(の次)を指すiterator を返します。 |
const_iterator begin() const |
slist の先頭要素を指すconst_iterator を返します。 |
const_iterator end() const |
slist の末尾要素(の次)を指すconst_iterator を返します。 |
size_type size() const |
要素数が0であることを知るには L.size() == 0 ではなく L.empty() することをおすすめします。 |
size_type max_size() const |
slist に格納可能な(論理的な)最大要素数を返します。 |
bool empty() const |
slist 内の要素数が 0 のとき true を返します。 |
slist() |
空のslist を構築します。 |
slist(size_type n) |
n 個の T() を要素とするslist を構築します。 |
slist(size_type n, const T&t) |
n 個の t を要素とするslist を構築します。 |
slist(const slist&) |
コピー・コンストラクタ |
|
シーケンス [f, l) を要素とする slist を構築します。 |
~slist() |
デストラクタ |
slist& operator=(const slist&) |
代入演算子。 |
void swap(slist&) |
お互い全要素を交換します。 |
reference front() |
先頭要素を返します。 |
const_reference front() const |
先頭要素を返します。 |
void push_front(const T&) |
要素を先頭に挿入します。 |
void pop_front() |
先頭要素を削除します。 |
iterator previous(iterator pos) |
++prev == pos なるprevを返します。 |
const_iterator previous(const_iterator pos) |
++prev == pos なるprevを返します。 |
iterator insert(iterator pos, const T& x) |
pos が指す位置の直前にx を挿入します。pos . |
|
pos が指す位置の直前にシーケンス[first, last) を挿入します。 |
void insert(iterator pos, |
pos が指す位置の直前にn 個のx を挿入します。 |
iterator erase(iterator pos) |
pos が指す位置にある要素を削除します。 |
iterator erase(iterator first, iterator last) |
範囲[first, last) にある要素を削除します。 |
void clear() |
全要素を削除します。 |
void resize(n, t = T()) |
要素数がn となるよう、要素の削除もしくはt の挿入を行ないます。 |
iterator insert_after(iterator pos) |
pos が指す位置の直後にT() を挿入します。挿入された要素を指すiteartor を返します。 |
iterator insert_after(iterator pos, const value_type& x) |
挿入された要素を指す |
|
pos が指す位置の直後にシーケンス[f, l) を挿入します。 |
void insert_after(iterator pos, size_type n, const value_type& x) |
pos が指す位置の直後に n 個のx を挿入します。 |
iterator erase_after(iterator pos) |
pos が指す位置の直後の要素を削除します。 |
iterator erase_after(iterator before_first, iterator last) |
範囲[before_first+1, last) にある要素を削除します。 |
void splice(iterator position, slist& L) |
position が指す位置の直前にL の全要素を移動します。 |
void splice(iterator position, slist& L, iterator i) |
position が指す位置の直前に i が指すL の要素を移動します。 |
void splice(iterator position, slist& L, iterator f, iterator l) |
position が指す位置の直前にL 内のシーケンス[f, l) |
void splice_after(iterator pos, iterator prev) |
|
void splice_after(iterator pos, iterator before_first, iterator before_last) |
pos が指す位置の直後にシーケンス[before_forst+1, before_last+1) を移動します。 |
void remove(const T& value) |
value と等しい全要素を削除します。 |
|
p(*i) が真となる全要素 *i を削除します。 |
void unique() |
隣接する相等しい要素を削除します。 |
void merge(slist& L) |
ソートされた*this とL とを*this にマージします。 |
|
comp による大小関係に基づいてソートされた*this とL とを*this にマージします。 |
void reverse() |
全要素の順序を反転します。 |
void sort() |
全要素を昇順にソートします。 |
|
comp による大小関係に基づいて全要素を昇順にソートします。 |
bool operator==(const slist&, const slist&) |
ふたつのslist が等値であればtrue を返します。 |
bool operator<(const slist&, const slist&) |
ふたつslist の各要素を辞書順で比較します。 |