Dequeつくってみた


投稿ツリー



前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2009/7/20 2:52 | 最終変更
SHOO  管理人   投稿数: 658
D2でRangeをつかってみるテストです。
チェック不足でバグとか多そうですが…

#code(:RenderAttaches/forum/100/deque.d)
投票数:51 平均点:5.10
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2009/7/20 22:08
SHOO 
簡単なドキュメントです。ちょっと読みにくいけど…
他に欲しい関数とか、逆に要らない関数とかありますか?

D1.0のTangoばっかりいじっていたけど、D2.0もたまにいじるとすっごく楽しいな…!

D2.0は不慣れなので、この書き方はマズイとか、こう書いた方がスマートっぽく見える、とかなにかツッコミどころがあったらコメントよろしくお願いします!

----

* class Deque(T)
リングバッファを扱うことのできる配列クラス
:this()&br;this(T[] ary)&br;this(in T[] ary)&br;this(in size_t aLength)&br;this(in size_t aLength, in size_t aReserveCapacity)|コンストラクタ
ary…初期化のための配列を指定します。書き換え可能なら直接その配列を編集しようとします。書き換え不可能ならコピーをとります。
aLength…配列の長さをあらかじめ予約します。要素数を指定します。
aReserveCapacity…配列のメモリ容量をあらかじめ予約します。要素数を指定します。
:final length[setter/getter]|配列の長さを設定/取得することのできるプロパティです。
:final size_t capacity(size_t)[setter/getter]|配列のメモリ容量を設定/取得することのできるプロパティです。
:final T opIndex(size_t)|添え字演算子オーバーロード。要素を返します。
:final T opIndexAssign(T, size_t)|添え字の示す要素に値を代入します。
:DequeRange opSlice()&br;DequeRange opSlice(size_t,size_t)|配列のスライスをRangeとして返します。
:void opSliceAssign(XXX, size_t, size_t)|配列のスライスに値を代入します。XXXのとれるものは、TおよびRangeです。
:final void expandFront(size_t sz)|配列の先頭に空要素を追加して拡張します。デフォルトで初期化はされないので注意。空の要素は必ず値を代入してください。もしくはinitvalを指定してください。追加した要素は添え字でアクセスすることができます。
sz…拡張する要素の個数を指定します
initval…拡張した後の初期化に使用する値を指定することができます。
:final void expandBack(size_t sz)&br;final void expandBack(size_t sz, T initval)|配列の末尾に空要素を追加して拡張します。デフォルトで初期化はされないので注意。空の要素は必ず値を代入してください。もしくはinitvalを指定してください。追加した要素は添え字でアクセスすることができます。
sz…拡張する要素の個数を指定します
initval…拡張した後の初期化に使用する値を指定することができます。
:final void trimFront(size_t sz)|最初の要素をsz個削除する
sz…削除する要素の個数を指定します
:final void trimBack(size_t sz)|最後の要素をsz個削除する
sz…削除する要素の個数を指定します
:final void pushBack(in T val)|最後に値を追加する
val…追加する要素の値を指定します
:final void pushFront(in T val)|最初に値を追加する
val…追加する要素の値を指定します
:final void sort()()&br;final void sort(FN)(FN less)&br;final void stableSort()()&br;final void stableSort(FN)(FN less)|並べ替えを行います。sortは安定な並べ替えではないため、その用途の場合はstableSortを利用してください。
less…2引数の関数で、第一引数が前に並んでほしかったらtrueを返す関数を渡す
:final void expand(size_t aIdx, size_t aLength)&br;final void expand(DequeIterator!(Deque!(T)) aItr, size_t aLength)|aIdxもしくはaItrの場所に長さaLength分だけ空白の領域を確保します。
:final void insert(Ty)(size_t idx, Ty val)|idxの示す場所にvalを追加します。TyはTまたはRangeです。が、自分自身のRangeをやるのはダメです。
:final DequeRange!(Deque!(T)) range()&br;final DequeRange!(Deque!(T)) range(size_t first, size_t last)|Rangeを返します。スライスと同じです。
:final const DequeIterator!(const Deque!(T)) begin()|最初の要素のイテレータを返します。
:final const DequeIterator!(const Deque!(T)) end()|最後の次の要素(つまり、endから要素にアクセスすることはできない)のイテレータを返します。
:final const T[] dup(T[] dst = null)&br;final const immutable(T)[] idup()|データのコピーを組み込みの配列として返します。
:その他Rangeとしてのメンバ|empty, popFront, front, popBack, back, back
** [private] struct DequeRange(Ary)
Range用の構造体。スライスやrange()で取得可能
-追加メソッド
:T[] dup(T[] dst=null)|レンジ内の要素の配列を得る
:-T[] idup()|レンジ内の要素のimmutableな配列を得る

** [private] struct DequeIterator(Ary)
Iterator用構造体。begin, endで取得可能
-追加メソッド
:bool valid()|イテレータが有効範囲内にあるか確認する。有効であればtrueを返す
投票数:159 平均点:5.22
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2009/7/22 0:56
SHOO  管理人   投稿数: 658
そういえばPhobosのalgorithmの中で、範囲指定のところに[0..$]のようなものが頻繁に使われているのだけど…
今回のような、Rangeをつかうことを前提としたクラスや構造体を作成した場合、これが邪魔をしてコンパイルエラーとか出たような気がします。
今回は無理やりPhobosの中身を~.lengthに変更してやってみてますけど…
$演算子オーバーロードなんてできませんよね?

>静的/動的を問わず、配列の [ ] の中では、 lengthという名前の変数が暗黙に宣言され、 その配列の長さがセットされます。 $ という記号を使うこともできます。

を見る限り、.lengthのプロパティの値を利用してもよさげな気もしますが…
投票数:153 平均点:4.44
返信する

このトピックに投稿する

題名
ゲスト名
投稿本文

  条件検索へ


メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu