株式会社エス・スリー・フォー

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 をサポートしていません。

sliststd::listに比べて機能的には劣ります。が、双方向イテレータを必要としない用途であれば、管理しなければならないリンクが単方向で済むため、std::listより若干ながらコンパクトかつ高速です。

標準C++が定めるコンテナの要求を満たすため、slistにはstd::listと同等のメソッドが実装されています。
しかしながら前の要素へのリンクを持たないため、insserterasestd::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

slist内の要素数を返します。※このメソッドが定数時間で完了することを仮定してはいけません。

要素数が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&) コピー・コンストラクタ

template <class InputIterator>
slist(InputIterator f, InputIterator l)
シーケンス [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.

template<class InputIterator>
void insert(iterator pos, InputIterator f, InputIterator l)
posが指す位置の直前にシーケンス[first, last)を挿入します。
void insert(iterator pos,
size_type n, const value_type& x)
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が指す位置の直後に xを挿入します。

挿入された要素を指すiteartorを返します。


template<class InputIterator>
void insert_after(iterator pos, InputIterator f, InputIterator l)
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)

posが指す位置の直後に prevが指す位置の直後の要素を移動します。

prevは他のslistの要素を指すiteratorでも構いません。

void splice_after(iterator pos, iterator before_first, iterator before_last) posが指す位置の直後にシーケンス[before_forst+1, before_last+1)を移動します。
void remove(const T& value) valueと等しい全要素を削除します。

template<class Predicate>
void remove_if(Predicate p)
p(*i) が真となる全要素 *i を削除します。
void unique() 隣接する相等しい要素を削除します。
void merge(slist& L) ソートされた*thisLとを*thisにマージします。

template<class BinaryPredicate>
void merge(slist& L, BinaryPredicate comp)
compによる大小関係に基づいてソートされた*thisLとを*thisにマージします。
void reverse() 全要素の順序を反転します。
void sort() 全要素を昇順にソートします。

template<class BinaryPredicate>
void sort(BinaryPredicate comp)
compによる大小関係に基づいて全要素を昇順にソートします。
bool operator==(const slist&, const slist&) ふたつのslistが等値であればtrueを返します。
bool operator<(const slist&, const slist&) ふたつslistの各要素を辞書順で比較します。