-std=c++11を消した話

 つい先ほどテンプレを載せたばかりだが、ちょこちょこと進展があったのでもう一回。

#define INF 100000000

よりも

const int INF = 100000000;

のほうがよさそうというツッコミが入ったのでそのことについて。話をまとめる能力がないので時系列順に。
 これは確かに後者のほうがINFの型を明示していてよいのだが、INFを少し大きくしたらintをlong longに書き換えるのが面倒だなぁというズボラな理由により避けていた。すると、autoが使えますよと教えてくれた方がいたため早速使ってみようという気持ちになる。しかし、autoを使うとなると常にc++11を使わないといけない。これは、-std=c++11をコンパイルオプションとしてつけなければいけないということであり、多少面倒くさい。このことを呟いていたら優しいフォロワーの方たちが解決案を教えてくれた。

  1. エイリアスを使えば解決する
  2. gcc6ではデフォルトでc++11

 しばらく前者をググっていたのだが、よくわからないなぁと思っていたら後者のことを教えてもらい、gcc6を入れようという気持ちになる。
 
gasin.hatenadiary.jp
この記憶があるので少し嫌な気持ちになりながらも、haskellのプラットフォーム内にあるMinGWとおさらばする時期が来たということで
MinGW-w64 - for 32 and 64 bit Windows - Browse /Toolchains targetting Win64/Personal Builds/dongsheng-daily/6.x at SourceForge.net
ここからgcc6を入れる。特に問題なく入り、実際にコンパイルしてみると確かにデフォルトでc++11になっており、また、to_stringもちゃんと使えた。めでたしめでたし。
 最後にテンプレをもう一度。

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0; i < n; i++)
#define rep1(i,n) for(int i = 1; i < n; i++)
#define repv(i,n) for(int i = n-1; i >= 0; i--)
#define fi first
#define sc second
#define pb push_back
using namespace std;
typedef long long ll;

char BUF[3500000];
inline void I(int&a){scanf("%d",&a);}
inline void I(int&a,int&b){scanf("%d%d",&a,&b);}
inline void I(int&a,int&b,int&c){scanf("%d%d%d",&a,&b,&c);}
inline void I(int&a,int&b,int&c,int&d){scanf("%d%d%d%d",&a,&b,&c,&d);}
inline void L(ll&a){scanf("%lld",&a);}
inline void L(ll&a,ll&b){scanf("%lld%lld",&a,&b);}
inline void L(ll&a,ll&b,ll&c){scanf("%lld%lld%lld",&a,&b,&c);}
inline void L(ll&a,ll&b,ll&c,ll&d){scanf("%lld%lld%lld%lld",&a,&b,&c,&d);}
inline void S(string&str){str.clear();scanf("%s",BUF);int s=strlen(BUF);rep(i,s)str.pb(BUF[i]);}
inline void SV(vector<int>&v){v.clear();scanf("%s",BUF);int s=strlen(BUF);rep(i,s)if('a'<=BUF[i]&&BUF[i]<='z')v.pb(BUF[i]-'a');else v.pb(BUF[i]-'A');}

const auto EPS = 1e-10;
const auto INF = 100000000;
const auto MOD = 1000000007;
typedef pair<ll,ll> P;

int n;

int main(){
    I(n);
}