DOSEIの日記

技術メモ+日常ログ

C++

Range based for の為の組み合わせ生成イテレータ

以下の例は昔のバージョンです。最新版は github に置いてみました。 github.com 実験で、全組合せに対して繰り返し処理をしたい時に使う。 先に使用例。 C++11 以降で使える range-based-for 文を使っているので、 gcc なら -std=c++11 (or -std=c++0x) が…

STL algorithm for_each は要素を変更していい

参考文献 for_each - cpprefjp - C++ Library Reference c++ - Why is std::for_each a non-modifying sequence operation? - Stack Overflow 要するに for_each は、 "non-modifying sequence operation" (シーケンスを変更しない操作) となっているので、…

逐次更新ループの書き方

反復計算などで、前回の値を利用して、新しい値を逐次的に計算するプログラムについて。 例として、平方根の計算を考えると、 を、 x_0=1 の初期値 (なんでもいいけど) から順に計算していけばいい。プログラムでは、途中の値を残す必要はないので、順次上書…

関数・クラステンプレートの明示的なインスタンス化 (具体化) (explicit instantiation of a function/class template)

いつもどこに書かれているかわからなくなるので、メモ。 35.12 Why can't I separate the definition of my templates class from its declaration and put it inside a .cpp file? 関数やクラスのテンプレートは、常に使われるソースといっしょに置いておか…

value-initialized array by new operator

規格では 5.3.4 の 5 で、 int * a = new int [100] (); のように最後に括弧をつけることによって、 int 等の型でも value-initialized されることが規定されている。しかし、なぜか配列の new は初期化できないという説明がちまたであふれかえっている。ど…

多次元配列

捨てコードだと、画像の画素値を格納した変数として、 int I[2000][1000] = { {0} }; なんてやっちゃうよね。んで、サイズが大きいとメモリがスタックに確保できないで、セグフォが出ちゃう。 しょうがないから、初心に帰って、 int* I = new int[2000*1000]…

配列の一括変換

C++ には、 STL の algorithm に各要素に一括で関数を適用する for_each と transform があるのだが*1、 C# にはなさげ。こういうときは、 LINQ を使って、 var Y = (from x in X select f(x)).toArray(); とか書けばよし。しかも、 UnaryFunction みたいな…

valarray の代入演算子は同じサイズのデータをまるっとコピーする

std::valarray::operator=() は、サイズの異なる valarray 間では未定義。 vector のように assign チックには働かない。そして、この場合、エラーも出ない。したがって、初めてつかうときなど、あらかじめ、 std::valarray::resize() で容量を確保しておく。

複数の構造をもった点集合の表現

たとえば、ある空間上の点を表す型 Point があるとする。 この点の集合は、たとえば配列とか、 std::vector とか。中身は実体でもいいし、ポインタでもいいし、点のIDでもいい。 で、この集合 A に、構造情報も付け加えたい。たとえば、 kd-tree とか、 Dela…

Legendre 関数 in

TR1 では、 cmath に std::tr1::legendre, std::tr1::assoc_legendere が用意されている。 次数 l が 128 以上では結果が環境依存らしい。

private メンバのアクセス

あるクラスのメンバ関数内では、同じクラスのインスタンスの private メンバにアクセスできる。 class A { public: A& operator+=(const A& rhs) { x_ += rhs.x_; // rhs.x_ にアクセス可能 return *this; } private: int x_; }; 知らなかった…。 friend に…

Eigen 2, C++ template library for linear algebra

http://eigen.tuxfamily.org/ これはなかなか使いやすそう。 Fedora のパッケージにも含まれてる。ただし、バージョン 2 はまだベータ。

ostream_iterator

ある vector 要素をアルゴリズムを使ってストリームに適用させたいときがある。例えば、自分で作った型 Vec (vector と紛らわしいな)があって、これは std::ostream& operator を持っている。このとき vector<Vec> a を全部表示したい。 方法 1 (for) for(size_t</vec>…

グローバルスコープと内部リンケージ

C では通常、グローバルスコープに置かれた宣言や定義は他のオブジェクトから参照可能。つまり、あるソースで int gVar;とあれば、他のソースで extern int gVar;とすれば、リンカがこの2つを結合してくれる。しかし、間違って同じ名前のグローバル変数が複…

標準 C++ では, cmath の各関数は float, double, long double にオーバーロードされている。 例えば, abs() は double abs(double x); float abs(float x); long double abs(long double x);が定義されている。参考: http://www.ishiboo.com/~nirva/c++/stl…