cpp

浮動小数点数が0かどうか

cpp

たとえば 1 / x をするときに x == 0.0 だと困るな、と if(x == 0.0) return ... なんて書いたときに、-Wfloat-equalを付けているからだと思うんだけど「warning: comparing floating point with == or != is unsafe」という警告が出るので、 abs(x) methane…

平方数かどうか、改めdoubleの丸めに関する話

cpp

http://topcoder.g.hatena.ne.jp/nitoyon/20090208/1234068839「c++の1.0の型って何だろう」って思った。まあsqrtはdoubleの引数を取れるみたいなのでdoubleで渡すということにしてみる。doubleの仮数部の精度は52bitだから、大雑把に言って12bit足りない。1…

平方数かどうかの判定

cpp

さっさとこうすればよかったんじゃないか。 int main(){ ULL n = 0; ULL oldn; ULL i = 0; while(true){ ULL rt = ULL(sqrt(double(n))); if(rt * rt != n || rt != i){ MSG(NG); DP(i); break; } i++; oldn = n; n += i * 2 - 1; if(oldn > n) break; } MSG…

探索のパフォーマンスはどうやって比較すればいいか

cpp

「N個の要素が与えられて、その中からM個を選んだ順列について何かを計算したい」というときの要素のたどり方って何が最速なんだろう。そしてどれが最速かを調べるベンチマークってどうやって書いたらいいんだろう。まわりのループの部分だけ書いたらコンパ…

最中限読み切りプログラム高速化

cpp

std::listはpush_backもpop_frontもO(1)なんだっけ?カードを1枚ずつ使いながら探索するところで、まず[1, 2, 3]から1を使って後続の処理に[2, 3]を渡して、、、探索が終わったらまた[1, 2, 3]に戻して、次は2を使って[1, 3]を渡して、、、という処理をする…

boost::operatorsとprivate継承とfriendの話

cpp

boost:operatorsっていうのは「operator==の結果を否定したものを返す」という内容でoperator!=を定義してくれるライブラリで(かなりはしょっている)、operator==を定義するだけで!=も使えるようになるのでラクチンです。くわしくはこちら:letsboost::opera…

aliasを使ってみる & boost::assign は N個追加するのにO(N^2)のコピーをするのか?

cpp

何かコピーが重たいオブジェクトのvectorがあったとする(名前はmatrix)。これのi番目について何度も処理をするときにいちいちmatrix[i]って書くのは面倒だし読みにくいし。ここは「line」みたいな別名をつけたい。 Pythonだと、変数は根本的に参照なので lin…

代入演算子を定義するときには「引数が自分自身」という罠に注意

cpp

「勉強がてら」書いたコードを実用的な目的に使おうとする人が出るとは思わなかったので注意書きを足しておいたshared_ptrを作るについて。奥さんや光成さんに指摘してもらった内容を忘れないようにメモしておきます。この前のコードはこういう使い方をする…

shared_ptrを作る

cpp

C++のtemplateでBREW用にshared_ptrを書いてみた - 清水川Webをちらりとみて、短かったので勉強がてら読まずに実装してみた。いろいろ教えてもらいながら。 - なおこれのコードを使おうとする人がいるといけないので改めて注意書きを書いておくと「勉強がて…

stl_function.h

cpp

http://boost.cppll.jp/HEAD/libs/lambda/doc/ar01s03.html template <class T> : public binary_function<T, T, T> struct plus { T operator()(const T& i, const T& j) const { return i + j; } }; 文法がわからない…。/stl_function.h - Google ソースコード検索 template <class _Tp></class></t,></class>…

続・optional

cpp

こうなった。やりすぎ。 typedef long long LL; // 素数かどうかを判定する bool isPrime(LL n){ if(n == 2) return true; if(n % 2 == 0) return false; for(LL i=3; i*i<=n; i+=2){ if(n % i == 0) return false; } return true; } typedef optional<LL> OLL; </ll>…

リストの内包表現みたいなのを作りたかったんだけど

cpp

まだ力不足でできなかった。SRM400 Div2 Level1をさくっと2行くらいで解きたいのだが。 template<typename IN, typename OUT, typename UnaryFunction> vector<OUT> mapcar(vector<IN> xs, UnaryFunction f){ vector<OUT> result(xs.size()); transform(xs.begin(), xs.end(), result.begin(), f); return result; }; void pri</out></in></out></typename>…

今日覚えたこと

cpp

簡潔な言葉で箇条書きにすることは自分の理解を整理するのにも役立つ気がした。 STLの解説とかで (*it).first とか書いてあるのはあくまで説明用であって普通は it->first と書く。 自作ライブラリとかで渡された参照を変更しないような関数を作ったらconst…

optionalを使ってみる

cpp

ついうっかりオーバーフローしてしまって0点、というのが頻出はまりパターンなので、optioalを使ってMaybeモナド的な整数型を作ればいいんじゃないかと思った。というわけで「掛け算はオーバーフローする可能性がある」ということを忘れずにいられる型ができ…

オーバーロード失敗

cpp

OLL llpow(LL n, size_t m){ return llpow(OLL(n), m); } OLL llpow(OLL n, size_t m){ if(m == 0) return OLL(1); if(m == 1) return n; return mul(n, llpow(n, m - 1)); } コンパイルエラーになって悩んだ。これ上のllpowの時点では上のllpowしか定義され…

今日覚えたこと

cpp

勉強しないつもりだったけどTopCoderが近づいてくるとついつい勉強してしまう、プログラマの三大美徳の一つ、自尊心の強さ。 boost::optional HaskellのMaybeみたいなのがC++にもあった! これを使えばだいぶ楽になる! http://www.kmonos.net/alang/boost/c…

今日覚えたこと

cpp

昨日boostをビルドしている間に読んでいたSTLの解説で、numericの中にaccumulateってのがあったので喜んで使ってみた。今回の問題は文字列を使うものがなくて全部整数だったので大活躍。 accumulate(t.begin(), t.end(), 0); で和がとれる。0 + *(t.begin())…

今日覚えたこと

cpp

int xをlong yに変換するのにlong y = (long)xとかlong y = long(x)とか書くのはよくない。これは無条件の型キャストであって、本当に必要なときにしか使ってはいけない。gotoみたいなもの。for文でできることをgotoで書くのはよくないのと同じような感じ。 …

cpp

次のコード、上も下もOKなのに // OK long tmp[2] = {10L, 20L}; plus<long> add; cout << add(tmp[0], tmp[1]) << endl; --- // OK long tmp[1][2] = {{10L, 20L}}; plus<long> add; cout << add(tmp[0][0], tmp[0][1]) << endl; なんで下のコードはエラーになるのかな</long></long>…

cpp

動かない理由は後で考える。 class MinDifference { public: int closestElements(int A0, int X, int Y, int M, int n) { int res=10000; vector<int> a(1,A0); for(;a.size()<n;a.push_back(((a.back()*X)+Y)%M)); sort(a.begin(), a.end()); vector<int> buf; adjacent_difference(a.begin(), a.end(), buf); return buf[min_element(…</n;a.push_back(((a.back()*x)+y)%m));></int>

C++のテンプレートで素数計算

cpp

C++のテンプレートで計算をするなんて変態だと思っていたのだけど、奥さんがさくっと10分くらいで書いたFizzBuzzのコードを見るとなんか非常に素直で読みやすいコードだったので、僕もテンプレートで何かしてみることにしました。 Kazuho@Cybozu Labs: C++ …

今日のC++

cpp

覚えたこと。 using namespace std; STLの諸々の関数をグローバル空間にぶちまける。TopCoder的には常套手段。 algorithmのなかにminとmaxはあるが、引数は2個限定。min_elementとかでリストの中の最小値の場所を得ることができるのでPythonのmin(xs)に相当…