Search on the blog

2010年6月25日金曜日

ワーキングセット

やべっっ。。
eclipseやべーー。

eclipseでC/C++を開発できるプラグインCDTというものを1カ月前ほどに導入した。
コンパイルや実行をショートカットキーで出来るし、自動補完機能や、デバッガ機能もあって満足していたが、一つだけ不満な点があった。
それは、プロジェクトのコンパイル・・・・

初期設定でプロジェクト内のすべてのC/C++ファイルをコンパイルして、リンクして実行ファイルを作るようになっているため、同一プロジェクト内に、mainを持つファイルを複数個作成することができなかった。
つまり、TopcoderMarathonというプロジェクトを作って、その中に問題ごとのフォルダを作成するということが出来なかった。(1つの問題に付き、1つのmain関数を持ったファイルを作ることになるため、うまく動作しない。)
makeファイルをいじれば何とかなるはずだが、どうも上手くいかない。。cygwinとmingw両方入れてるから設定が変になってるのか??ちゃんと目的のコンパイラに設定してるんだけどな。。どうもうまくいかない。プロジェクト内のフォルダ毎にコンパイルして、実行ファイルを作るという設定にどうしても辿り着けなかった。。

て、ことで、暫定的な解決策として、使ってないmain()関数をコメントアウトするという荒行で何とか忍んでいたが、やっと解決策見つけたーーーーー!!!

ワーキングセット。こんな便利な機能がeclipseに!!
これは、ここ1カ月1番の発見かもしれない~~~!!

ワーキングセットは、プロジェクトの上位概念である。
簡単にいうと、ワーキングセットの中にプロジェクトを格納できる。(厳密に言うと、ワーキングセットはエクスプローラ内に表示させるプロジェクトをフィルタリングするための仕組みみたい。)
これを使えば、TopcoderMarathonというワーキングセットを作って、その中に問題ごとのプロジェクトを作成すればOK!!
万事解決!!
やばい、eclipse、最高~~~~!!

2010年6月17日木曜日

Invincible Macros for C++(2) : For Iterator

When I started learning C++, I kind of thought that the "iterator" was really irritating.
What do you think?

I now think that iterators are similar to pointers and that I understand their convenience.
But it takes rather long time for you to write sources with iterators.

See the code below:
----------------------------------------------------
// e.g. 1
#include <iostream>
#include <vector>
#include <list>

using namespace std;

int main() {
   vector<int> vec;

   vec.push_back(1);
   vec.push_back(12);
   vec.push_back(167);

   vector<int>::iterator vec_p;
   for (vec_p = vec.begin(); vec_p < vec.end(); vec_p++)
      cout << *vec_p << endl;

   return 0;
}
----------------------------------------------------

In fact, you don't have to use iterators when you want to do stuff I listed above.
You can access to an element of the vector vec by using a pair of blankets and the corresponding index, like vec[i].
But you can't access to list's element this way.
So when you use list, you've got to utilize iterators like below:
----------------------------------------------------
// e.g. 2
#include <iostream>
#include <vector>
#include <list>

using namespace std;

int main() {
   list<int> lt;

   lt.push_back(1);
   lt.push_back(3);
   lt.push_back(5);

   list<int>::iterator lt_p;
   for (lt_p = lt.begin(); lt_p != lt.end(); lt_p++)
      cout << *lt_p << endl;

   return 0;
}
----------------------------------------------------
Please notice that the exit criteria is different from that of vector.
Iterator for list don't have the operator "<" or ">", so you have to use "!=".
Ummm, the iterator part is loooog, don't you think?
Then how's this?

----------------------------------------------------
// e.g. 3
#include <iostream>
#include <vector>
#include <list>

#define fori(it, x) for (__typeof((x).begin()) it = (x).begin(); it != (x).end(); it++)

using namespace std;

int main() {
   // for vector
   vector<int> vec;

   vec.push_back(1);
   vec.push_back(12);
   vec.push_back(167);

   fori(vec_p, vec)
      cout << *vec_p << endl;

   // for list
   list<int> lt;

   lt.push_back(1);
   lt.push_back(3);
   lt.push_back(5);

   fori(lt_p, lt)
      cout << *lt_p << endl;

   return 0;
}
----------------------------------------------------

Invincible Macros for C++(1) : For Loop Macros

What kind of code do you write down with C++ when you wanna display the whole numbers from 0 up to 9?
Yup, it's quite simple.
I bet you write something like this:

----------------------------------------------------
// e.g. 1
#include <iostream>
using namespace std;

int main() {
   for (int i = 0; i < 10; i++)
      cout << i << endl;
   return 0;
}
----------------------------------------------------

That will do, but kind of cliche.
Then how's the following code?

----------------------------------------------------
// e.g. 2
#include <iostream>
#define forf(i, n) for(int i=0; i<(int)(n); i++)
using namespace std;

int main() {
   forf (i, 10)
      cout << i << endl;
   return 0;
}
----------------------------------------------------

What do you think? Guess it depends.
But the source above saves you a lot of time especially when it comes to programming contests demanding speedy conding!!

In the same way, you can utilize the macro below:
#define forb(i, n) for(int i=(int)(n)-1; i >= 0 ; i--)