最新 / kaoru's clog

カテゴリ[p] - ChangeLog

2004-09-01 Wed

* boost [p]

boost/numeric/ublas で sparse_matrix を扱う方法。
http://www-user.tu-chemnitz.de/~wgu/ublas/matrix_sparse_usage.html

2004-07-01 Thu

* cpp [p]

今日、はじめて、priority_queue の使い方がわかった。コンテナに格納
しながら、逐次に優先度順にソートしてくれるらしい。便利。

まず、priority_queue に入れたい要素オブジェクト(構造体)を定義する。

struct result {
 double score;
 unsigned int j;
 unsigned int e;
 friend bool operator<( const result& r1, const result& r2 )
 {
   return ( r1.score < r2.score );
 };
 friend std::ostream& operator<<( std::ostream& os, const result& r ) {
   os << r.score << "\t" << r.j << "\t" << r.e;
   return os;
 };
};
 struct result r1;
 r1.score = 1.5;
 r1.j = 1;
 r1.e = 5;
 struct result r2;
 r2.score = 2.3;
 r2.j = 2;
 r2.e = 3;

ここで、operator< と operator<< を friend にしておく。
(奥義を理解していないので、ほとんど、おまじない)

で、 priority_queue の宣言。先ほどの struct result がコンテナの要
素オブジェクト。最後の引数の二項述語の終りに () が付かないのに注意。
よくわからんが、これで型を指定していることになるらしい。
(yet another おまじない。)

 std::priority_queue< result, std::vector< result >, std::less< result > > pq;
 pq.push( r1 );
 pq.push( r2 );
 while ( ! pq.empty() ) {
   std::cout << pq.top() << std::endl;
   pq.pop();
 }

出力はこんな感じ。優先度が高い方から(score in a descending order)
で出力される。

2.3 2 3
1.5 1 5

ラティスのパスの N-best candidates を出力したいなと思っていたが、
priority_queue がわからず停滞していた。今回、ポイントが分かったの
で、自分でも実装できそう。

2004-04-02 Fri

* cpp [p]

operator>> と operator<< の override で挫折。

istream_iterator や ostream_iterator と copy を組み合わせると楽できる。
標準入力から vector 型の v へ整数を格納。

std::vector< int >::iterator iter = v.begin();
copy( std::istream_iterator< int >( std::cin ), std::istream_iterator< int >(), iter );

vector 型の v を標準出力で表示。

copy( v.begin(), v.end(), std::ostream_iterator< int >( std::cout, " " ) );

fstream も (i|o)stream_iterator と連結できるからお得。


最新 / kaoru's clog