pythonのあの処理をC++書いてみようシリーズ① - 8月 20, 2018 こんにちは、ぐぐりら(@guglilac)です。 ## このシリーズはなに これまでpythonを使うことが多かったのですが、せっかく競プロをやってるのだからC++も勉強したいなあと思い最近勉強を始めました。 pythonならさくっと書けるあの処理、どう書くんだろう、、ということがよくあるので、勉強したところだけまとめておこうと思います。 最近はpythonでプログラミングを始める人も多いみたいだし、pythonならわかるけど他の言語も勉強してみたい、的な方にも役に立てばいいなと思います。 (シリーズとかいって一回で終わらないようにせねば) ## 今回のテーマとなる処理 タプルのリストをsortする処理をしたくなるときがたまにありますよね。 こんなやつ ```python a=[(1,2),(3,1),(10,6),(5,4),(2,7)] ``` いくつかの要素をまとめたものをpythonではタプルと言います。 これを何も考えず`sort()`で並び替えるとこうなります。 ``` a.sort() print(a) #=> [(1, 2), (2, 7), (3, 1), (5, 4), (10, 6)] ``` みて分かる通り、タプルの1個目の要素をみて昇順に並び替えてくれます。 今回は、タプルの2番目の要素をみて昇順に並び替える処理について考えます。 pythonでは、`.sort()`に基準となるキーをlambda式で与えてあげることで簡単に実現できます。 ```python a.sort(key=lambda x: x[1]) ``` これは、 「aの各要素がxとしたとき、x[1]をkeyとして並び替えてね」 という処理になります。 簡単ですね。 ## C++だとどうかくの ```c++ #include #include #include typedef std::pair pair; void print(std::vector x){ std::cout << "["; for (size_t i = 0; i < x.size(); i++) { std::cout << "(" << x[i].first<< ", " < v; int a[5]={1,3,10,5,2}; int b[5]={2,1,6,4,7}; for (size_t i = 0; i < 5; i++) { v.push_back(pair(a[i],b[i])); } print(v); //std::sort(v.begin(),v.end(),compare_second); std::sort(v.begin(),v.end(),[](pair p1, pair p2){return p1.second < p2.second;}); print(v); return 0; } ``` 出力はこうなりました。 ```:結果 [(1, 2), (3, 1), (10, 6), (5, 4), (2, 7)] [(3, 1), (1, 2), (5, 4), (10, 6), (2, 7)] ``` pythonの時と同じタプルのリストを作りました。 c++では二つ組を表すときは`pair`とかいうものを使うみたいだったのでこれで。 `algorithm`のなかのsortを使うとソートできる。 3番目の引数になにやら指定するところはpythonと似ています。 リファレンスを見ると、第三引数には比較関数を与えるらしい。 比較関数は次の条件を満たすように定義する。 ```:比較関数の条件 連続する二つの要素を引数にして、前の要素が後ろの要素より小さい場合にtrueを返す ``` 昇順になっていたらtrueを返すような関数ですね。 コメントアウトしているところは、わざわざ比較関数を定義したものを使っています。 実際には、一回だけしか使わない関数なのでラムダ式を使うことが多そうです。 コメントアウトした次の行がそれです。 ## ちょっと疑問 いろいろ調べていると、どこかの記事で、関数の引数に ``` [](pair& p1, pair& p2){return p1.second < p2.second;} ``` みたいに参照を渡しているものがありました。 自分で気になって、&をつけるものとつけないものを試したのですが、どちらも正しくソートされたのです。 強い方に教えていただきたいです。。。 この記事をシェアする Twitter Facebook Google+ B!はてブ Pocket Feedly コメント
コメント
コメントを投稿