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 行目に定義があります。
◆ back()
template<class T, class AL = std::allocator<char>>
末尾の要素の参照を返します。
- 戻り値
- 末尾の要素の参照
Nlist.h の 547 行目に定義があります。
◆ begin() [1/2]
template<class T, class AL = std::allocator<char>>
コンテナの先頭を指す反復子を返します。
- 戻り値
- コンテナの先頭を指す反復子
Nlist.h の 562 行目に定義があります。
◆ begin() [2/2]
template<class T, class AL = std::allocator<char>>
コンテナの先頭を指す反復子を返します。
- 戻り値
- コンテナの先頭を指す反復子
Nlist.h の 566 行目に定義があります。
◆ capacity()
template<class T, class AL = std::allocator<char>>
アロケート済みの要素の個数を返します。
- 戻り値
- 要素の個数
Nlist.h の 498 行目に定義があります。
◆ cbegin()
template<class T, class AL = std::allocator<char>>
コンテナの先頭を指す反復子を返します。
- 戻り値
- コンテナの先頭を指す反復子(
const_iterator
)
Nlist.h の 570 行目に定義があります。
◆ cend()
template<class T, class AL = std::allocator<char>>
コンテナの末尾を指す反復子を返します。
- 戻り値
- コンテナの末尾を指す反復子(
const_iterator
)
Nlist.h の 583 行目に定義があります。
◆ Clobber()
template<class T, class AL = std::allocator<char>>
要素のデストラクタを呼んだりコンテナのメモリを解放することなく、コンテナを空に戻す。
- 説明
- 特別なアロケータを用意している等といった事情から、デストラクタやメモリ解放のプロセスを全てスキップしても問題ない場合のみに利用することができます。 高速な利用後の処理が可能になります。
Nlist.h の 656 行目に定義があります。
◆ EmplaceBack()
template<class T, class AL = std::allocator<char>>
template<class... Args>
インプレイスで要素を追加します。
- テンプレート引数
-
- 引数
-
- 戻り値
- 追加された要素へのポインタ。失敗した場合は
NULL
- 説明
Nlist
の末尾に要素を追加します。 要素はインプレイスに構築され、コピーコンストラクタ等は実行されません。 コンストラクタにはユーザーによって指定された引数が渡されます。
Nlist.h の 596 行目に定義があります。
◆ empty()
template<class T, class AL = std::allocator<char>>
コンテナが空かどうかを調べます。
- 戻り値
true
ならば空
Nlist.h の 502 行目に定義があります。
◆ end() [1/2]
template<class T, class AL = std::allocator<char>>
コンテナの末尾を指す反復子を返します。
- 戻り値
- コンテナの末尾を指す反復子
Nlist.h の 575 行目に定義があります。
◆ end() [2/2]
template<class T, class AL = std::allocator<char>>
コンテナの末尾を指す反復子を返します。
- 戻り値
- コンテナの末尾を指す反復子
Nlist.h の 579 行目に定義があります。
◆ front()
template<class T, class AL = std::allocator<char>>
先頭の要素の参照を返します。
- 戻り値
- 先頭の要素の参照
Nlist.h の 552 行目に定義があります。
◆ get_allocator()
template<class T, class AL = std::allocator<char>>
◆ operator[]()
template<class T, class AL = std::allocator<char>>
インデックスで要素を参照します。
- 引数
-
- 戻り値
- 要素の参照
Nlist.h の 557 行目に定義があります。
◆ pop_back()
template<class T, class AL = std::allocator<char>>
末尾の要素を削除します。
- 戻り値
- 成功した場合は
true
Nlist.h の 533 行目に定義があります。
◆ push_back()
template<class T, class AL = std::allocator<char>>
末尾に要素を追加してデフォルトコンストラクタで初期化します。
- 戻り値
- 追加された要素へのポインタ。失敗した場合は
NULL
Nlist.h の 507 行目に定義があります。
◆ reserve()
template<class T , class AL >
n
個の要素のためのメモリをアロケート済みにします。
- 引数
-
- 戻り値
- 成功ならば
true
Nlist.h の 782 行目に定義があります。
◆ resize()
template<class T, class AL = std::allocator<char>>
コンテナをリサイズします。
- 引数
-
- 戻り値
- 成功ならば
true
Nlist.h の 503 行目に定義があります。
◆ size()
template<class T, class AL = std::allocator<char>>
格納されている要素の個数を返します。
- 戻り値
- 要素の個数
Nlist.h の 495 行目に定義があります。
◆ swap()
template<class T, class AL = std::allocator<char>>
このクラス詳解は次のファイルから抽出されました: