電電のブログ

電電生だったひとのぼやき

コード書いててつまづいたとこ備忘録

最近競技プログラミングを頑張ろうと思っている電電です.
ちょくちょくpython,c++アルゴリズムを触り始めたんですが,同じだと思ってたものが,実は違っていたりしたので備忘録として残します.

Python3

まずPython3
バージョンは現在Python3.6.4rc1です

二次元以上のリスト宣言

まず二次元のリストの

inf = 10**10

#悪い例
[[inf]*m]*n

#良い例
[[inf for i in range(m)] for i in range(n)]

です.パッと見た感じ同じに見えるんですが,上の方だと値を代入する際に思いもよらない挙動になります.
詳しくはこちらの方がまとめてくれています.
sonickun.hatenablog.com

文字列をリスト形式で入れる方法

次はまたリストがらみですね.さっきKUPC2015の問題

A - 東京都
をといてたら文字列をリスト形式で入れる方法がこんがらがったので

words = [str(i) for i in input()]
words = list(str(input()))

まあこれはどっちでもいいのでお好きな方で.

2次元以上のリストについて指定した要素でソートするlambda.
position = [[1,2],[2,4],[2,6]]
sorted_position = sorted(key=lambda x:x[1])
#or
position.sort(key=lambda x:x[1])

sortとsortedは元のリスト情報が失われてもいいのかどうかを考えて使い分けて.

c++

関数内の計算順序について
  char str[3] = {'a','b','c'};
  int i=0;
  putchar(str[i]);

  //問題のコード
  putchar(str[i++]);
  cout<<i<<endl;

このコードなんですが最初にi++されてi==1のbが表示されると思いきや
最初にputchar(str(i))が通ってaが表示された後にi++が適用されるっぽいです.
よくわからん???

vectorの構造体に対する一部そーとの指定範囲について
vector<int>v(5);
for(int i=0;i<v.size();i++){
  v[i]=5-i;
}

//通常のソート
sort(v.begin(),v.end()); //{1,2,3,4,5}

//一部分のソート
sort(v.begin(),v.begin()+1);  //{5,4,3,2,1}

sort(v.begin(),v.begin()+3); //{4,5,3,2,1}

詳しくは以下のページにまとめられていますが,要約すると一部分のソートの第一引数~第二引数-1までがソートされるらしいです.
【c++】vectorとsortの謎(一部の区間だけをソートしたい!) | 水飴信号 -Starch Syrup Signal-




まあ今はこんなところか
どんどん足していきます