なんかこのところ時々アズリムの動画を見直していたらなんかはまった。
この毒のある厨二系後輩少女に……。
いや、よくできてるんですよね。
こうして見直してみるとものすごくキャラが立ってたりする。
ふぁー。
C++ の boost ライブラリーと格闘しています。
データ列の中からイテレーターを使ってデータを抽出しないといけないのですが、抽出元のオブジェクトとイタレーションするオブジェクトの対応をみつけられなくて頓挫していたり。
ちょっと適当書きますけどこんな感じ?
#include
BOOST_FOREACH にもトライしてるのですが、オブジェクト同士の連携がうまくいかない。
これでVECTOR のvec の中身を列挙できる、と。
vecに対してもメンバー関数begin()やend()が使えるみたいなので、それでこのイタレータを使って、個数が判明しないデータ構造から要素を取りだすことできるわけだ。
boodtの中にもFREACHが存在していて、例えばpolygonの演算をboostで行う場合に使われていたり。
#include <~>
~
~
namespace bg=boost::geometry;
typedef bg::model::d2::point_xy
これでふたつのポリゴンの合成結果である、ポリンゴンのベクターであるoutが設定されるわけです。
ポリゴンは穴開きのものが作ることができるのですが、外側のポリゴンはouoter ringで、内側がinterior ringとなっているようです。ちゃんと確認できていないのですが、それぞれがベクターテンプレートになっているようなので、polugon の並びであるpolygonとして出力できそう 。
子供のpolygonがいない場合は単純にBOOST_FOREACHを使うのが便利なはず。
std::vector<polygon> out;
bg::union_(bx, poly, out);
BOOST_FOREACH(polygon const& p,out)
{
for(auto it=out.begin();it !=out.end();++it)
{
std::cout<<bg::get(*it)<0><<","<<bg::get(*it)<1><<std::endl;
}
}
}
polygonの中に穴があいているとき、外側のポリンゴンとは逆向きのポリゴンがベクター形式で格納されるっぽいのです。でも上の式のFOREACHに設定するoutとかpなどがどのようなかたまりで何のオブジェクトになっているのかがよくわからないんですよね。
色々と読み解かないといけないや。
ふみーん。
半月前まではC++はおろかCだって少ししか使ったことなかってたはずだったのになぁ。
後輩に教えてるうちに変数に二つポインター記号がついているものの意味を考えてしまいましたよ。大雑把に言うと二次配列みたいなものなのですね。昔Cの配列をかじったあとでPerlを徹底してやったもので、Cライク言語の配列の構造の考え方がわかった気がしますよ。
つまりある配列要素があると、その配列要素が配列になっている、という展開のしかたをするようにして配列を読むので、Fortranと配列のインデックスが入れ違うというのはそこから来てるみたいです。Fortranは行列の演算式をコーディングする際に便利だから添え字つきの行列と引数の順番が同じになるんですよね。つまり $ A_{ij} = \sum_k B_{ik}C_{kj} $ みたいな感じです。
配列はそのまま使われますね。
A(I,J)=0.0
DO K=1,3
A(I,J)=A(I,J)+B(I,K)*C(K,J)
END DO
みたいな感じです。
C だと a[]のそれぞれの成分がまた配列になっているので、{a[]}[]みたいになっているのですね。しかもインデックスは0からはじまる。
a[j][i]=0;
for(int k=0;k<3;k++){
a[j][i]=a[j][i]+b[k][i]*c[j][k];
}
これがまたどっかと難しくなったクラスについて考えなきゃいけないので、オブジェクトの構成メンバーとかをよく調べないと手も足も出ないのですね。
周囲にboostはおろかテンプレートも使ってる人がいないので情報収集が困難です。今から文法書を購入する余裕がないので、ネットの情報だけが頼りです。
でも色々な関連ある項目について調べて、それを組み合わせるしかないんだよあぁ‥‥‥。
がーーー。