C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 53 を表示中)
■29934 / )  Re[7]: テンプレート変数からイテレータ変数の宣言
□投稿者/ 774RR (262回)-(2008/12/16(Tue) 17:13:58)
template<typename T> struct List {
  list<T> list;
  list<T>::iterator it;
  void iterate_begin() { it=list.begin(); }
  bool iterate_isend() { return it!=list.end(); }
  void iterate_next() { ++it; }
};
であるとして。

まずこれだけなら例外に対しては安全 (だと思う:規格書読みきれていない)

次にこれはスレッド安全ではなく、再帰安全でもない。
複数のスレッドから同時に it を操作してしまうと互いに壊しあってしまう。
反復中に呼び出すルーチンから再度 it を操作してしまうと壊れてしまう。
なのでお勧めできない。俺ならこういうコードは書かない。

for (list<T>::iterator it=container.begin(); it!=container.end(); ++it) { ... }
であれば、この it はローカル変数なのでスレッド安全であるし、再帰安全でもある。お勧め。
(反復中にコンテナを書き換える場合は話が違うので除外するものとする)

速度の件なんだけど、メンバ変数と自動変数で1回の反復につき数クロック違うだけだよ。
10000回のループなどでは観測できっこないよ。特に、画面出力などしてれば余計に。
(処理時間のほとんどすべてが画面出力にかかる時間なので)
# だけど C++ ユーザってその数クロックを気にしたりするわけで

で、なぜ処理を(インライン)関数化するのがだめなわけ?
ほんの数行のループ処理だけ template 化する必要がある、とか思っている?
全体を template な関数にしてもいいぢゃん。

返信 編集キー/


管理者用

- Child Tree -