C++

おばふろ

C++

こういうコード書いたらコンパイラに警告出させたいとかよく思う. int a, b; ... long long c = a * b; 整数オーバーフローが起こりそうな箇所をおおざっぱに検出してくれるツールとかないんかな.

コンパイルが止まらない

C++

なんか珍しいものを見た.TopCoderではコンパイルに30秒以上かかっちゃダメらしい. コンパイルができないと何の情報も無いまま目だけでデバッグしなくちゃならないので精神的にとても辛い.どうやら原因はでかいメンバ変数のようです. #include<vector> class C { </vector>…

アクセス制御の抜け穴 (C++/Java ; protected編)

Python/Ruby編 OCaml編 さて C++ と Java です。 privateへのアクセスはひとまず後回しにするとして、まずは protected なところから考えていきましょう。 C++ の場合 (protected) 欲しいメソッドがサブクラスからアクセス可能なので、自分でサブクラスを定…

識別子にマルチバイト使ったりテンプレート引数に文字列渡したり型名を文字列にしたりしたい。

C++

びみょう…。 #include <iostream> class SeeYouNextWeek; namespace Yuno {int X = ((std::cout<<"ひだまりスケッチ"),1);} int _ = ((std::cout << "x360 "), 1); template <class T> int X() { std::cout << "来週も見てくださいね!" << std::endl; return 1; } int main() {</class></iostream>…

文字リテラルの型

C++

C と C++ で文字リテラルにつく型が異なります。 C では int, C++ では char になるようです。 $ cat clit.c #include <stdio.h> int main() { printf("%u\n", sizeof 'x'); return 0; } $ gcc clit.c && ./a.out 4 $ g++ clit.c && ./a.out 1このことについて考察し</stdio.h>…

テンプレートの別名

C++

例えば priority_queue の最小値を返す版って個人的にはわりと使うんですけど、毎回 priority_queue, greater > とか書くの面倒いわけですね。そんなわけで、パラメータ付き typedef があったら便利だと思った。 ↓こんな風に書きたい。 template <class T> typedef pr</class>…

std::complex

C++

なんとなくまとめてみました。自分用ですが。 T = 実部と虚部の型 C = complex と思ってください。 Constructor complex(T r = 0, T i = 0); Public methods T real() const; T imag() const; foreach OP in += -= *= /= C& operator OP (const C&); C& oper…

等値と等価とunique

C++

等値(equality) a == b 等価(equivalence) !(a 任意の要素に対してこれらの結果が一致する場合、単にsetに入れていけばユニークな集合ができあがるが、異なる場合は std::unique を使う。ただし、std::unique を使うには、等値である可能性があるものは必ず…

Fibonacci数 の一般項

一般項が、Fibonacci数を求めるプログラムにどの程度使えるか検証してみる。 無理数絡みなので、どのあたりで誤差が出るのかが興味の対象。 #include <iostream> #include <cmath> using namespace std; const double R5 = sqrt(5.0); //typedef int num_t; typedef long long</cmath></iostream>…

std::priority_queue

C++

よく嵌るのでメモ。 大きなものから出てくる 比較関数の実装法は頭に入れておく コンパイラのエラーメッセージに期待しない priority_queue<Hoge> pq; のように使うHogeクラス では、デフォルトでは比較に std::less<Hoge> が使われるので operator< の実装が必要。 clas</hoge></hoge>…

min/max更新

C++

更新する対象の名前が長くなる場合、x=min(x,y); や if(x>y){x=y;} と書くのは都合が悪い。 foo[i].bar().baz = min(foo[i].bar().baz, hoge); まずタイピングが面倒。 さらに、ここで foo が map 等の場合、両辺で1回ずつ O(log(n)) のアクセスが発生するし…

演算子

C++

?= なんてものがあったのか。 deprecated だけど。 x ?= はその逆。 int a = 10, b = 10, c = 10, d = 10; a ?= 1; d >?= 100; cout << a << endl << b << endl << c << endl << d << endl; 1 10 10 100 まぁ、普通は x = min(x,y); や x = max(x,y); を使う…

output integers

入力関数に引き続き、出力関数を自作してみました。 非負整数の出力に特化しています。型の拡張(unsigned や long long)とか符号拡張は容易。 // 10進表記で出力し改行 void puti(int n) { if (!n) { fwrite("0\n", 1, 2, stdout); return; } char str[11]…

std::adjacent_difference

C++

ここの説明が微妙に間違っていたので注意。std::adjacent_difference(ii, ii+4, result); の処理内容は 階差。配列で書くとこんな計算 result[0] = 0; resutl[1] = ii[1] - ii[0]; result[2] = ii[2] - ii[1]; result[3] = ii[3] - ii[2]; ここで第一要素(r…

= による初期化

C++

Hoge hoge = ...; という形での初期化は、まずデフォルトコンストラクタによってオブジェクトが構築され、それに対して代入演算子で代入を行うのではなく、引数つきのコンストラクタが呼び出される。 class Hoge { public: Hoge(): n(0) {} Hoge(const int a…

演算子オーバーロードの優先

C++

同じシグネチャの演算子オーバーロードをメンバ関数とfriend関数で行った場合 どちらが優先されるのか気になったので調べてみました。 #include <iostream> using namespace std; class Hoge { public: bool operator==(const int a) { return true; } friend bool ope</iostream>…

binder

C++

std::bind1st, std::bind2nd(をカリー化したもの)の型はこんなかんじ bind1st: binary_function<T1, T2, R> -> T1 -> unary_function<T2, R> bind2nd: binary_function<T1, T2, R> -> T2 -> unary_function<T1, R>OCamlで書くと bind1st = fun f x -> fun y -> f x y bind2nd = fun f y -> fun </t1,></t1,></t2,></t1,>…

std::nth_elemtnt

C++

std::nth_elemtnt の挙動を説明するのに nth_element(first, middle, last); は partial_sort(first, middle+1, last); random_shuffle(first, middle); を線形時間でやる、というのはどうか。実装はこのへんかな。Median of Medians は覚えておこう。

引数

C++

std::priority_queue は、テンプレート引数とコンストラクタの引数の順序に不整合があって気持ち悪い。テンプレート引数は、『要素の型・実装に使うコンテナの型・比較ファンクタクラス』の順 template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type> > class priority_queue; コン</typename></class>…

SRM347

TopCoder の SRM に初めて参加しました。結果はこんな感じ。(部屋内で2位・DIV2で11位) 開始直後に友達から電話がくるというハプニングがありましたが、なんとか次回からDIV1でできるようです。わーい。 ちなみにタクシーの問題(1000pt)はさっぱりわかりませ…

C++ で関数型プログラミング

C++

整数を読んでその階乗を出力するだけのプログラム。 #include <iostream> #include <algorithm> #include <iterator> // istream_iterator, ostream_iterator using namespace std; int factorial(const int n) { return (n <= 1) ? 1 : n * factorial(n-1); } int main() { transform(istre</iterator></algorithm></iostream>…

En effet

C++

Effective C++ と Effective STL を読了。 マニアックな話題の一部は斜め読みで済ませたのであとでまた読み返す。 次は More Effective? …あまり読む気がしない。 自分の知識の浅さ、C++という変態言語の底知れなさがある程度実感できた。 これでもまだ氷山…

initialized after

C++

たまに出て、なんなんだろうなぁと思っていたこの警告。 foo.cpp:37: warning: 'Foo::bar' will be initialized after調べてみると メンバ変数 d と i の宣言順と、コンストラクタ初期化子での記述順が違うとでる警告です。 メンバ変数の宣言順とコンストラ…

Effective STL

C++

Effective STL をぼちぼち読んでいます。 むちゃくちゃ勉強になるなぁ。 2章まで読んだところですが、知らなかったこといっぱいでした。 記憶の整理を兼ねて一部をまとめておきます。 template内で依存型(T::const_iterator とか)を使うときは、typenameで宣…

bitset

C++

std::bitset を使ってみました。 http://www.cplusplus.com/reference/stl/bitset/ http://www.cppreference.com/cppbitset/ 「bitset<8>」 のように < > の中に型以外のものを突っ込めることを初めて知りました。これを使うとめくるめくメタプログラミング…

input integers

cin を使った入力がものすごく遅いので、ICPC系の問題を解く時に問題になってくることがあります。 普通はscanfを使っておけば問題ないのですが、まだ改善の余地があるので整数入力に特化した関数を自作してみました。 // integer (10進, 非負, 桁あふれしな…

順列都市。

Anagram http://acm.uva.es/p/v1/195.html 順列を列挙するだけの問題ですが、 英文解釈を激しく間違ってWAを連発orz ... should be output in alphabetically ascending order. An upper case letter goes before the corresponding lower case letter. これ…

メモ

C++

POJ Monthly contest やってきました。 今日学んだこと。 でかい配列は、ローカル変数として確保できない。 (causing segmentation error) ⇒ ヒープもしくはグローバルや静的変数の領域にとる。 環境によっては スタックサイズが数KBしかないとか。そりゃオ…

C++

STL の complex を解説したページがあまり見つからない。 複素数平面上で幾何をゴリゴリやる練習をしたいんですが。

多重継承

C++

多重継承すると、いろんなところで曖昧性が生まれる。 メソッドのシグネチャの衝突は、 using でどこから派生した関数を使うのか明示する オーバーライドする のどちかによって解決する。 そうしないと、「曖昧だ」というコンパイルエラー。 実験 #include <iostream> </iostream>…