cpp
たとえば 1 / x をするときに x == 0.0 だと困るな、と if(x == 0.0) return ... なんて書いたときに、-Wfloat-equalを付けているからだと思うんだけど「warning: comparing floating point with == or != is unsafe」という警告が出るので、 abs(x) methane…
http://topcoder.g.hatena.ne.jp/nitoyon/20090208/1234068839「c++の1.0の型って何だろう」って思った。まあsqrtはdoubleの引数を取れるみたいなのでdoubleで渡すということにしてみる。doubleの仮数部の精度は52bitだから、大雑把に言って12bit足りない。1…
さっさとこうすればよかったんじゃないか。 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…
「N個の要素が与えられて、その中からM個を選んだ順列について何かを計算したい」というときの要素のたどり方って何が最速なんだろう。そしてどれが最速かを調べるベンチマークってどうやって書いたらいいんだろう。まわりのループの部分だけ書いたらコンパ…
std::listはpush_backもpop_frontもO(1)なんだっけ?カードを1枚ずつ使いながら探索するところで、まず[1, 2, 3]から1を使って後続の処理に[2, 3]を渡して、、、探索が終わったらまた[1, 2, 3]に戻して、次は2を使って[1, 3]を渡して、、、という処理をする…
boost:operatorsっていうのは「operator==の結果を否定したものを返す」という内容でoperator!=を定義してくれるライブラリで(かなりはしょっている)、operator==を定義するだけで!=も使えるようになるのでラクチンです。くわしくはこちら:letsboost::opera…
何かコピーが重たいオブジェクトのvectorがあったとする(名前はmatrix)。これのi番目について何度も処理をするときにいちいちmatrix[i]って書くのは面倒だし読みにくいし。ここは「line」みたいな別名をつけたい。 Pythonだと、変数は根本的に参照なので lin…
「勉強がてら」書いたコードを実用的な目的に使おうとする人が出るとは思わなかったので注意書きを足しておいたshared_ptrを作るについて。奥さんや光成さんに指摘してもらった内容を忘れないようにメモしておきます。この前のコードはこういう使い方をする…
C++のtemplateでBREW用にshared_ptrを書いてみた - 清水川Webをちらりとみて、短かったので勉強がてら読まずに実装してみた。いろいろ教えてもらいながら。 - なおこれのコードを使おうとする人がいるといけないので改めて注意書きを書いておくと「勉強がて…
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>…
こうなった。やりすぎ。 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>…
まだ力不足でできなかった。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>…
簡潔な言葉で箇条書きにすることは自分の理解を整理するのにも役立つ気がした。 STLの解説とかで (*it).first とか書いてあるのはあくまで説明用であって普通は it->first と書く。 自作ライブラリとかで渡された参照を変更しないような関数を作ったらconst…
ついうっかりオーバーフローしてしまって0点、というのが頻出はまりパターンなので、optioalを使ってMaybeモナド的な整数型を作ればいいんじゃないかと思った。というわけで「掛け算はオーバーフローする可能性がある」ということを忘れずにいられる型ができ…
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しか定義され…
勉強しないつもりだったけどTopCoderが近づいてくるとついつい勉強してしまう、プログラマの三大美徳の一つ、自尊心の強さ。 boost::optional HaskellのMaybeみたいなのがC++にもあった! これを使えばだいぶ楽になる! http://www.kmonos.net/alang/boost/c…
昨日boostをビルドしている間に読んでいたSTLの解説で、numericの中にaccumulateってのがあったので喜んで使ってみた。今回の問題は文字列を使うものがなくて全部整数だったので大活躍。 accumulate(t.begin(), t.end(), 0); で和がとれる。0 + *(t.begin())…
int xをlong yに変換するのにlong y = (long)xとかlong y = long(x)とか書くのはよくない。これは無条件の型キャストであって、本当に必要なときにしか使ってはいけない。gotoみたいなもの。for文でできることをgotoで書くのはよくないのと同じような感じ。 …
次のコード、上も下も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>…
動かない理由は後で考える。 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++のテンプレートで計算をするなんて変態だと思っていたのだけど、奥さんがさくっと10分くらいで書いたFizzBuzzのコードを見るとなんか非常に素直で読みやすいコードだったので、僕もテンプレートで何かしてみることにしました。 Kazuho@Cybozu Labs: C++ …
覚えたこと。 using namespace std; STLの諸々の関数をグローバル空間にぶちまける。TopCoder的には常套手段。 algorithmのなかにminとmaxはあるが、引数は2個限定。min_elementとかでリストの中の最小値の場所を得ることができるのでPythonのmin(xs)に相当…