Programming Tips

templateでクラスの大きさを指定する方法

Tatsuya Yatagawa
C++でクラスを作るときにsizeofで帰ってくる大きさを自由に決められるようにしたいなぁと思ったのでやり方を調べてみました。 まず、普通のint型みたいなものの大きさを変更する方法からです。これには__declspec(align(#))装飾子を使います。 // sizeof(Int4) == 4 struct Int4 { int n; }; // sizeof(Int8) == 8 (Visual C++) __declspec(align(8)) struct Int8 { int n }; // sizeof(Int8) == 8 (g++) __attribute__((aligned(8))) struct Int8 { int n }; で、このalignサイズをtemplateで指定できないかな、と考えるわけ ...

言われれば当たり前だけど気付かないvectorのこと

Tatsuya Yatagawa
最近Half-Edge構造のプログラムを書いていて、vectorの性質で気をつけるべきことがあることに気付いたので備忘録的に記しておきます。 Half-Edge構造のことをしっている人ならなんとなくわかると思うのですが、あるオブジェクトに何らかの別のオブジェクトを指すポインタを持たせておきたい場合があると思います。 今は分かりやすくするためにオブジェクト1とオブジェクト2と呼ぶことにしましょう。 オブジ ...

sortとpriority_queueの並び変え順序

Tatsuya Yatagawa
こんにちは。 だいぶ昔から気になってはいたのですが、C++ STLではsortとpriority_queueで並び替えられる順序が違うのが気になっています。 sortもpriority_queueも並べ替え順序の初期値はstd::lessになっているはずなんですが、次のプログラムを実行すると、逆の並び順になります。 ソースコード #include <stdlib.h> #include <time.h> #include <queue> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> v; priority_queue<int> que; srand((unsigned long)time(NULL)); for(int i=0; i<10; i++) { int x = rand() % 100; v.push_back(x); que.push(x); } std::sort(v.begin(), v.end()); for(int ...

ポインタの参照渡し

Tatsuya Yatagawa
調べてみるとC++の入門書にも書いてあるような内容らしいのですが、ポインタにも参照渡しというものが存在するということを今日初めて知りました。 プログラミングの教科書などは関数にポインタを渡して、そのポインタが指すオブジェクトの要素を変更すると、関数の外で見てもやはりポインタが指すオブジェクトの要素が変更されている、という話がよく書かれています。これは当然といえば当然で、関数の中と外で差しているポイン ...

JavaのHashSetを使う時に・・・

Tatsuya Yatagawa
年末に「世界で戦うプログラミング力を鍛える150問」という本を読んでいるのですが、その問題を解いている時にJavaのHashSetの使用方法で少し悩んだ部分があったので、ここでメモを。 一般に、ハッシュテーブルというと、オブジェクトごとに振られたハッシュ値が等しいかどうかで、オブジェクトが等価であるかどうかを判定するものだと思い込んでいたので、JavaのHashSetでもそういう実装になっているのだ ...

char* と char[] の違い

Tatsuya Yatagawa
日経ソフトウェアの2013年2月号に書かれていた記事で、C++ (あるいはC言語) のchar*とchar[]の違いについて触れてありました。普段はstd::stringしか使わないので、こんな違いがあるとは思わなかった。次のコードを見てください。 #include <stdlib.h> int main() { char* var = "this is charactors"; var[0] = 'T'; printf("%sn", var); } 一見正しそうに見えるし、実際コンパイルは通る (なんと!!) 。だけど6行目で実行時エラーが起こります。なんでもchar*に渡 ...