nlib
nn::nlib::Nlist< T, AL > クラステンプレート

std::vectorに似た、コピーコンストラクタを持たないオブジェクトを格納可能なコンテナ類似クラスです。 [詳解]

#include "nn/nlib/Nlist.h"

nn::nlib::nlist::NlistBaseT< T >, nn::nlib::nlist::NlistAlloc< is_empty, AL >を継承しています。

公開型

typedef
typedef BaseType::value_type value_type
 要素型 T
 
typedef AL allocator_type
 アロケータの型 AL
 
typedef BaseType::size_type size_type
 符号なし整数型(size_t)
 
typedef BaseType::difference_type difference_type
 符号つき整数型(ptrdiff_t)
 
typedef BaseType::reference reference
 要素への参照です。
 
typedef BaseType::reference const_reference
 要素への読み取り専用参照です。
 
typedef BaseType::pointer pointer
 要素へのポインタです。
 
typedef BaseType::const_pointer const_pointer
 要素への読み取り専用ポインタです。
 
typedef BaseType::iterator iterator
 前方反復子です。
 
typedef BaseType::const_iterator const_iterator
 読み取り専用前方反復子です。
 

公開メンバ関数

size_type size () const noexcept
 格納されている要素数を返します。
 
size_type capacity () const noexcept
 アロケート済みの要素の個数を返します。 [詳解]
 
bool empty () const noexcept
 格納されている要素数が0ならばtrue、それ以外ならfalseを返します。
 
bool resize (size_type n) noexcept
 コンテナをリサイズします。 [詳解]
 
bool reserve (size_type n) noexcept
 n 個の要素のためのメモリをアロケート済みにします。 [詳解]
 
pointer push_back ()
 末尾に要素を追加してデフォルトコンストラクタで初期化します。 [詳解]
 
pointer push_back (T &&rhs) noexcept
 一時オブジェクトrhsをムーブして末尾に追加します。 [詳解]
 
pointer push_back (const T &rhs)
 rhsを末尾に追加します。 [詳解]
 
bool pop_back () noexcept
 末尾の要素を削除します。 [詳解]
 
void clear () noexcept
 コンテナをクリアします。
 
allocator_type get_allocator () const noexcept
 アロケータを取得します。 [詳解]
 
reference back ()
 最後の要素への参照を取得します。
 
const_reference back () const
 上記関数のconst修飾付き版です。
 
reference front ()
 最初の要素への参照を取得します。
 
const_reference front () const
 上記関数のconst修飾付き版です。
 
reference operator[] (size_type n)
 n番目の要素を取得します。nは格納されている要素数未満である必要があります。 [詳解]
 
const_reference operator[] (size_type n) const
 上記関数のconst修飾付き版です。
 
iterator begin () noexcept
 先頭要素を指す反復子を取得します。
 
const_iterator begin () const noexcept
 先頭要素を指す読み取り専用反復子を取得します。
 
const_iterator cbegin () const noexcept
 先頭要素を指す読み取り専用反復子を取得します。
 
iterator end () noexcept
 末尾の次を指す反復子を取得します。
 
const_iterator end () const noexcept
 末尾の次を指す読み取り専用反復子を取得します。
 
const_iterator cend () const noexcept
 末尾の次を指す読み取り専用反復子を取得します。
 
void shrink_to_fit () noexcept
 可能ならばアロケートされたメモリを返却します。
 
template<class... Args>
pointer EmplaceBack (Args &&... args)
 インプレイスで要素を追加します。 [詳解]
 
void Clobber () noexcept
 要素のデストラクタを呼んだりコンテナのメモリを解放することなく、コンテナを空に戻す。 [詳解]
 
コンストラクタ、デストラクタ、及び初期化
 Nlist () noexcept
 デフォルトコンストラクタです。 空のコンテナを作成します。
 
 Nlist (const AL &al) noexcept
 アロケータを指定します。空のコンテナを作成します。
 
 ~Nlist () noexcept
 デストラクタです。
 
 Nlist (Nlist &&rhs)=default
 ムーブコンストラクタです。
 
Nlistoperator= (Nlist &&rhs) noexcept
 ムーブ代入演算子です。
 
 Nlist (Nlist &rhs, move_tag) noexcept
 ムーブコンストラクタに相当します。
 
Nlistassign (Nlist &rhs, move_tag) noexcept
 ムーブ代入演算子に相当します。
 

詳解

template<class T, class AL = std::allocator<char>>
class nn::nlib::Nlist< T, AL >

std::vectorに似た、コピーコンストラクタを持たないオブジェクトを格納可能なコンテナ類似クラスです。

テンプレート引数
T要素の型
ALアロケータの型。デフォルトはstd::allocator<char>です。
説明
以下に挙動の詳細や注意点を箇条書きに記します。
  • std::push_backでは(例外を有効にしない限り)、要素の追加時にout of memoryによるクラッシュが発生する可能性があります。Nlistでは要素の追加に失敗した場合、NULLポインタを返すので戻り値をチェックすることで問題に対処することが可能です。
  • 内部でオブジェクトの再配置を行いません。一般にstd::vectorは要素を追加していく場合(又はreserveを実行した際に)、より大きなメモリを割り当てそこにデータをコピーするという動作を行います。Nlistでは追加される要素についてだけ新たにメモリを割り当てる動作を行うことで、再配置を行いません。
    この動作により、再配置に必要なメモリコピーのコストや元のメモリの解放コストををかけずにstd::vectorよりも高速なpush_back動作を行うことが可能です。 また、このような動作によりスタックアロケータのような単純なアロケータを使う場合でも、メモリを効率良く割り当てることが可能です。
  • Nlist内部のコードは要素型Tのコピーコンストラクタを利用しません。従って要素型Tにはコピーコンストラクタが定義されている必要がありません。
  • Nlistではインプレイスの初期化による要素の追加が可能です。Nlistはコピーコンストラクタを利用しないため、通常のpush_back()関数は実装されていません。
    以下のメンバ関数で要素の追加が可能です。
    • T* push_back(void), デフォルトコンストラクタで作成した要素を追加します。
    • T* EmplaceBack(Tのコンストラクタへの引数リスト), 引数リストを渡してNlist内部でコンストラクタを起動して要素を追加します(コピーコンストラクタの実行を避けることができます)。
  • NlistではForward iteratorを実装しています。
    • Nlistの内部はサイズの異なる配列のリストになっているのでiteratorの順方向の参照はstd::vector並に高速です。
    • std::advance()の実行効率は \(O(\log n)\)です。
    • std::distance()の実行効率は \(O(1)\)です。
  • operator[]をサポートしています。ただし、実行効率は \(O(\log idx)\)です。
  • Nlistが定義するコンストラクタの種類は限られています。これは以下の理由によるものです。
    • out of memory問題を回避するため
    • 要素型にコピーコンストラクタを要求しないため。
各種例:
msgpack/json/json.cpp, msgpack/jsonrpc/jsonrpc.cpp.

Nlist.h32 行目に定義があります。

関数詳解

◆ capacity()

template<class T, class AL = std::allocator<char>>
nn::nlib::Nlist< T, AL >::capacity ( ) const
inlinenoexcept

アロケート済みの要素の個数を返します。

戻り値
要素の個数

Nlist.h466 行目に定義があります。

◆ Clobber()

template<class T, class AL = std::allocator<char>>
nn::nlib::Nlist< T, AL >::Clobber ( )
inlinenoexcept

要素のデストラクタを呼んだりコンテナのメモリを解放することなく、コンテナを空に戻す。

説明
特別なアロケータを用意している等といった事情から、デストラクタやメモリ解放のプロセスを全てスキップしても問題ない場合のみに利用することができます。 高速な利用後の処理が可能になります。

Nlist.h630 行目に定義があります。

◆ EmplaceBack()

template<class T, class AL = std::allocator<char>>
template<class... Args>
nn::nlib::Nlist< T, AL >::EmplaceBack ( Args &&...  args)
inline

インプレイスで要素を追加します。

テンプレート引数
Argsテンプレートパラメータパック
引数
[in]args要素を構築するための引数
戻り値
追加された要素へのポインタ。失敗した場合はNULL
説明
Nlistの末尾に要素を追加します。 要素はインプレイスに構築され、コピーコンストラクタ等は実行されません。 コンストラクタにはユーザーによって指定された引数が渡されます。

Nlist.h571 行目に定義があります。

◆ get_allocator()

template<class T, class AL = std::allocator<char>>
nn::nlib::Nlist< T, AL >::get_allocator ( ) const
inlinenoexcept

アロケータを取得します。

戻り値
アロケータ

Nlist.h509 行目に定義があります。

◆ operator[]()

template<class T, class AL = std::allocator<char>>
nn::nlib::Nlist< T, AL >::operator[] ( size_type  n)
inline

n番目の要素を取得します。nは格納されている要素数未満である必要があります。

引数
[in]n要素の位置
戻り値
n番目の要素への参照

Nlist.h529 行目に定義があります。

◆ pop_back()

template<class T, class AL = std::allocator<char>>
nn::nlib::Nlist< T, AL >::pop_back ( )
inlinenoexcept

末尾の要素を削除します。

戻り値
成功した場合はtrue

Nlist.h505 行目に定義があります。

◆ push_back() [1/3]

template<class T, class AL = std::allocator<char>>
nn::nlib::Nlist< T, AL >::push_back ( void  )
inline

末尾に要素を追加してデフォルトコンストラクタで初期化します。

戻り値
追加された要素へのポインタ。失敗した場合はNULL

Nlist.h475 行目に定義があります。

◆ push_back() [2/3]

template<class T, class AL = std::allocator<char>>
nn::nlib::Nlist< T, AL >::push_back ( T &&  rhs)
inlinenoexcept

一時オブジェクトrhsをムーブして末尾に追加します。

引数
[in]rhs末尾に追加される要素
戻り値
追加された要素へのポインタ。失敗した場合はNULL

Nlist.h483 行目に定義があります。

◆ push_back() [3/3]

template<class T, class AL = std::allocator<char>>
nn::nlib::Nlist< T, AL >::push_back ( const T &  rhs)
inline

rhsを末尾に追加します。

引数
[in]rhs末尾に追加される要素
戻り値
追加された要素へのポインタ。失敗した場合はNULL
説明
Tのコピーコンストラクタを実行する際に例外を投げる可能性があります。

Nlist.h498 行目に定義があります。

◆ reserve()

template<class T , class AL >
bool nn::nlib::Nlist< T, AL >::reserve ( size_type  n)
noexcept

n 個の要素のためのメモリをアロケート済みにします。

引数
[in]nアロケート済みにする要素数
戻り値
成功ならばtrue

Nlist.h766 行目に定義があります。

◆ resize()

template<class T, class AL = std::allocator<char>>
nn::nlib::Nlist< T, AL >::resize ( size_type  n)
inlinenoexcept

コンテナをリサイズします。

引数
[in]nリサイズ後のサイズ
戻り値
成功ならばtrue

Nlist.h471 行目に定義があります。


このクラス詳解は次のファイルから抽出されました: