std::vector
に似た、コピーコンストラクタを持たないオブジェクトを格納可能なコンテナ類似クラスです。
[詳解]
#include "nn/nlib/Nlist.h"
nn::nlib::nlist::NlistBaseT< T >, nn::nlib::nlist::NlistAlloc< is_empty, AL >を継承しています。
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.h の 32 行目に定義があります。
◆ capacity()
template<class T, class AL = std::allocator<char>>
アロケート済みの要素の個数を返します。
- 戻り値
- 要素の個数
Nlist.h の 466 行目に定義があります。
◆ Clobber()
template<class T, class AL = std::allocator<char>>
要素のデストラクタを呼んだりコンテナのメモリを解放することなく、コンテナを空に戻す。
- 説明
- 特別なアロケータを用意している等といった事情から、デストラクタやメモリ解放のプロセスを全てスキップしても問題ない場合のみに利用することができます。 高速な利用後の処理が可能になります。
Nlist.h の 630 行目に定義があります。
◆ EmplaceBack()
template<class T, class AL = std::allocator<char>>
template<class... Args>
インプレイスで要素を追加します。
- テンプレート引数
-
- 引数
-
- 戻り値
- 追加された要素へのポインタ。失敗した場合は
NULL
- 説明
Nlist
の末尾に要素を追加します。 要素はインプレイスに構築され、コピーコンストラクタ等は実行されません。 コンストラクタにはユーザーによって指定された引数が渡されます。
Nlist.h の 571 行目に定義があります。
◆ get_allocator()
template<class T, class AL = std::allocator<char>>
◆ operator[]()
template<class T, class AL = std::allocator<char>>
n
番目の要素を取得します。n
は格納されている要素数未満である必要があります。
- 引数
-
- 戻り値
n
番目の要素への参照
Nlist.h の 529 行目に定義があります。
◆ pop_back()
template<class T, class AL = std::allocator<char>>
末尾の要素を削除します。
- 戻り値
- 成功した場合は
true
Nlist.h の 505 行目に定義があります。
◆ push_back() [1/3]
template<class T, class AL = std::allocator<char>>
末尾に要素を追加してデフォルトコンストラクタで初期化します。
- 戻り値
- 追加された要素へのポインタ。失敗した場合は
NULL
Nlist.h の 475 行目に定義があります。
◆ push_back() [2/3]
template<class T, class AL = std::allocator<char>>
一時オブジェクトrhs
をムーブして末尾に追加します。
- 引数
-
- 戻り値
- 追加された要素へのポインタ。失敗した場合は
NULL
Nlist.h の 483 行目に定義があります。
◆ push_back() [3/3]
template<class T, class AL = std::allocator<char>>
rhs
を末尾に追加します。
- 引数
-
- 戻り値
- 追加された要素へのポインタ。失敗した場合は
NULL
- 説明
T
のコピーコンストラクタを実行する際に例外を投げる可能性があります。
Nlist.h の 498 行目に定義があります。
◆ reserve()
template<class T , class AL >
n
個の要素のためのメモリをアロケート済みにします。
- 引数
-
- 戻り値
- 成功ならば
true
Nlist.h の 766 行目に定義があります。
◆ resize()
template<class T, class AL = std::allocator<char>>
コンテナをリサイズします。
- 引数
-
- 戻り値
- 成功ならば
true
Nlist.h の 471 行目に定義があります。
このクラス詳解は次のファイルから抽出されました: