-
Notifications
You must be signed in to change notification settings - Fork 13
Open
Description
Description
現在のバージョン v4.7.1 の default の main.cpp はたいてい次を出力する。
#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; (i) < (int)(n); ++ (i))
#define REP3(i, m, n) for (int i = (m); (i) < (int)(n); ++ (i))
#define REP_R(i, n) for (int i = (int)(n) - 1; (i) >= 0; -- (i))
#define REP3R(i, m, n) for (int i = (int)(n) - 1; (i) >= (int)(m); -- (i))
#define ALL(x) ::std::begin(x), ::std::end(x)
using namespace std;
この #include 部分は platform.system() と $CXX で制御されていて、環境によっては bits/stdc++.h は回避される。
template-generator/onlinejudge_template_resources/template/main.cpp
Lines 18 to 25 in dd4d543
| if platform.system() == "Linux" and "clang" not in os.environ.get("CXX", "g++"): | |
| include = "#include <bits/stdc++.h>" | |
| else: | |
| include = "\n".join([ | |
| "#include <iostream>", | |
| "#include <string>", | |
| "#include <vector>", | |
| ]) |
全員が満足するものは不可能なので「不満なら申し訳ないが自分でカスタマイズしてね」と言うしかないが、それでもできるだけ多くのユーザにとって使いやすいものにしておきたい。いまのところ現状の main.cpp は妥当であると (@kmyk は) 判断しているが、そうでなさそうなら代替案を提案してください。
Possible implementations and the analysis
#include について:
- このまま
- 常に
#include <bits/stdc++h>を使う- これは環境によって壊れるからだめ
- 常に
#include <bits/stdc++h>を避ける (include は必要最小限に留める)- これは不便なだけだと思う
- 常に
#include <bits/stdc++h>を避ける (よく使う標準ヘッダをいくつか選んで include しておく)- 「よく使う」の定義が人によって変わるので「全員にとって不便でない」を目指すと「すべて include する」になるはず
- 常に
#include <bits/stdc++h>を避ける (すべての標準ヘッダを include しておく)- 長くなってつらい
- C++17 で新規に追加された標準ヘッダなどをどうすればよいのか
#define されている REP macro などについて:
- 使う (このまま)
-「macro にはMACRO_CASEを使う」という通常の作法と「できるだけ混乱のなさそうな名前を使う」を満たしてはいるはず - 使う (名前や定義を修正する)
- 現状の名前がどれくらい標準的なのかの調査はしてない。より標準的かつ適切な名前があるなら乗り換えたい
- 「
repとREPが両方 define されている」「FORとREPが両方 define されている」などのとき、たいていどちらかは#define X(i, n) for (int i = 0; i < n; ++ i)でもう一方は#define Y(i, m, n) for (int i = m; i < n; ++ i)だと思うが、初見で自信を持って見分けられるものであってほしい
- 消す
- 不便
using namespace std; について:
- 使う
- 特にデメリットないので足しておきたい
leftとかy0みたいな名前のグローバル変数を定義できなかったりすると思うけど、そもそもグローバル変数は使うべきでない。不適切なことをすると不適切な結果になるのは当然であり、これは気にしなくてよい
- 消す
- 不便なだけだと思う
その他について:
- このまま
- なにか追加する
- 例:
typedef long long ll; - 例:
template <class T, class U> using P = pair<T, U>;
- 例:
Metadata
Metadata
Assignees
Labels
No labels