見出し画像

プログラム学習記録【15日目】/pair,tuple,auto,スニペット

公開処刑

眠さに勝てず更新をサボってしまっていた。
バイトに行き、イライラする事があって勉強にどうも集中できず、ベッドにダイブしたらそのまま寝てしまう、という負の連鎖をずっと繰り返していた。
今日、とてもスッキリすることがあり、こうして更新を再開するメンタルに戻ったのだ。

僕のしているバイト、イベント運営のバイトは基本派遣バイトなので、学生バイト以外にいわゆるフリーターという人もいる。
最近イライラしていたのはバイトチーフを担うような人に対してなのだが、いかんせん社員さんがいないところでの仕事が適当な上に指示も曖昧で、そのくせ失敗は他人のせいにする、褒められればそれが他人がやった作業でも自分の手柄にしたがる、という、まるでジャイアンのような人物なのだ。今回は仮にKさんとしておく。
対して、僕のことは、一通り内容はわかるが、いかんせん経験が足りない、まだまだ半人前という状態だと認識してもらいたい。バイト歴は3年とまあまあ頑張っているのだが、10年、20年とバイトとして頑張っていらっしゃる人もいる世界なのだ。
プログラムで言うところの、コードは一通り書けるがデバッグができない初心者、と例えれば伝わるだろうか。

ここ最近、毎週末開かれているイベントにバイトとして参加していたのだが、Kさんは今回チーフとしてではなく一般のバイトとしてセクションに配属されていた。社員さんによる決定なので本人は不服なのだがそれを言うことはできず、結果社員さんが見ていないところでサボる、という手段に出てきたのだ。
僕の配属されたポジションはKさんが配属された運営と近いポジションで運営をすることもあり、サボっているKさんに絡まれる機会が多かった。

例えば、僕がやっている作業に関してあーしろこーしろだの、あのバイトは使えないだの、代わりにこの作業をやってくれだの、その内容は多岐に及ぶ。
指摘される内容も、たしかにそれはそうした方が良い、ということは一度もなくて、クライアントが出すマニュアルに正規の方法が書いてあり、その方法以外は今回はやらないでほしい、と説明があったことなので、僕だって「こっちのほうが効率いいのにな」と思いながらも回り道をしていることがほとんどなのだ。
作業の肩代わりは更にひどく、休憩時間には必ず言いに来るほどなのだ。
今日など、僕の休憩時間をKさんが肩代わりしてくれたおかげで、昼ごはんすら食べていない。
10時間バイトして、休憩できたのは移動中の5分程度だ。
程度こそあれ、このような自体が毎週続いていた。

しかし今日、急激に転機が訪れた。
夕方頃、その様子を見ていた別のセクションのチーフが、Kさんに対して、いいかげんにしろ、と一喝してくださったのだ。
そのことはチーフ陣を通して社員さんに伝わり、厳重注意が下された。
さらに同時刻、Kさんがサボっている様子がSNSにアップされていることが発覚し、事態は急加速。
社員さんへの説明とクライアントさんへの謝罪が行われ、混乱したKさんは先程怒られていた僕をサンドバッグにしていた件と勘違いし、クライアントさんにまでその話が伝わってしまい、すごい怒られ、減給の刑に処された。
僕の他にもマウントを取られていたバイトが複数いたようだが、一部始終はバイト終了後点呼前のバイト控室で行われたため、公開処刑されて、みな胸のつかえが取れたような顔をしていた。

一日の疲れが吹き飛んだ僕はこうしてPCに向き合い、更新の止まってしまっていた勉強へと乗り出すのであった。

3.02.pair/tupleとauto

pair 2つの値の組を表す型

pair<型1, 型2> 変数名;
pair<型1, 型2> 変数名(値1, 値2);

で宣言するが、型の宣言が必要ない

make_ pair(値1, 値2);

で宣言してしまったほうが取り扱いが楽。
各値には

変数名.first //1つ目の値
変数名.second //2つ目の値

でアクセスすることができる。
pairの解消を行うこともでき、変数を2つ先に宣言しておいてからそれぞれに代入する。

型1 変数1;
型2 変数2;
tie(変数1, 変数2) = pair型の値;

pairは2つの値についての記述だったが、一般的に用いるようにした型がtuple。

tuple<型1, 型2, …> 変数名;
tuple<型1, 型2, … 型n> 変数名(値1, 値2, … 値n);

で宣言する。
k番目の要素にアクセスする場合、

get<k>(変数)

また、pairと同じように

make_tuple(値1, 値2, …)

という様に宣言することもでき、こちらのほうが取り扱いが楽。

tie(変数1, 変数2, …)

でtupleの分解を行うこともできる。
pairやtupleを分解するときに、不要な要素がある場合、ignoreをtieの引数にわたすことで、対応する位置の値を破棄することができる。

型が同じpairやtuple同士は比較することができる。
1番目の要素が同じ場合は2番目、という様に各要素で比較を行う。

初期化を伴う変数の宣言や範囲for文では、型の宣言をautoと書くことにより省略することができる。

auto 変数名 = 初期値;
for (auto 変数名 : 配列関数){
   // 変数名 
}

型に別の名前をつけることができる。このとき、型エイリアスという方法を使う。

using pii = pair<int, int>; // int型のpairに pii という別名を付けて使えるようにする
using vi = vector<int>; // int型の1次元の型に vi という別名を付けて使えるようにする
using vvi = vector<vi>; // int型の2次元の型に vvi という別名を付けて使えるようにする

EX22.2つ目の値でソート

整数ai, bi のペアがN個与えられます。biが小さい順にペアを並べ替える。
biはすべて異なるものとし、入力は1から10の9乗までの整数とする。
んで、ここに来てサンプルプログラムはなくなった模様。1から考えていく。
1つ目に、入力されるペアの受け入れ体制を整える。
配列にsortという関数があるのでこれを利用するために、ペアごとの配列にしていく。
比較は1番目、2番目…という順番でされるので、比較したいbi = 2番目を先にしてペアを作り、ソートを行わせる。
同じ型ならpair同士での比較ができる、という性質を利用したもの。
というわけで受け入れ体制がこちら。

vector<pair<int, int>> num(N); //pairを配列として受け取る

これでpairを配列として受け取る準備ができた。
for文でこれに数値を入れていき、ペアの組み方をb,aにしておく。

 for (int i = 0; i < N; i++)
 {
   int a, b;
   cin >> a >> b;
   num.at(i) = make_pair(b, a); //ソートするのはbの方なのでb,a の順でペアにしておく
 }

配列が完成したら、これをソートする。

sort(num.begin(), num.end()); //sort(vec.begin(), vec.end())という構文 ちなみに逆順はreverse

最後にpairを一つ一つ解除していき、新しい変数として出力。b,aという並び順にここでも注意。

 for (int i = 0; i < N; i++)
 {
   int a, b;
   tie(b, a) = num.at(i); //ここでpairを解いておき、もとのa,bに入れ直す pairはb,a の順で作ったことに注意
   cout << a << " " << b << endl;
 }

全文は以下の通り。

#include <bits/stdc++.h>
using namespace std;
int main()
{
 int N;
 cin >> N;
 vector<pair<int, int>> num(N); //pairを配列として受け取る
 for (int i = 0; i < N; i++)
 {
   int a, b;
   cin >> a >> b;
   num.at(i) = make_pair(b, a); //ソートするのはbの方なのでb,a の順でペアにしておく
 }
 sort(num.begin(), num.end()); //sort(vec.begin(), vec.end())という構文 ちなみに逆順はreverse
 for (int i = 0; i < N; i++)
 {
   int a, b;
   tie(b, a) = num.at(i); //ここでpairを解いておき、もとのa,bに入れ直す pairはb,a の順で作ったことに注意
   cout << a << " " << b << endl;
 }
}

これで提出。

スニペット

Cppはこの学習で触るのが初めてなので、実行環境が様々整っていない。
今回、コードを1から作るということで、#include...のところをいちいち手打ちするのはめんどいな、と思い、スニペットを設定することにした。
pythonでは散々お世話になった機能だが、cppでは1つも設定してなかったのだ。

"Print to console": {
		"prefix": "cpp",
		"body": [
			"#include <bits/stdc++.h>",
			"using namespace std;",
			"",
			"int main()",
			"{",
			"  $1",
			"}",
		],
		"description": "chiche"
	}

って言う感じで設定しておけば、まっさらなcppファイルにcppと打ったあとTabキーを押すことで、上の文章が出現する、という便利機能だ。最後の$1は、カーソルをここに持ってくるよ、って意味で、かゆいところに手が届く。
pythonではこの機能に浸りすぎて、他のPCや環境で作業が思ったように進まず、学校のPCからは逃げ回ってきたし、新しいPCを買ったときや人に頼まれて別PCで作業しなければならなくなったとき、まずはVScodeをインストールし、スニペットの設定画面に自分のものを丸々コピーしてから使う始末である。
ちなみに人のPCでは作業終わりに全部消してから返すことを忘れたことはない。
せっかくなのでcppの方もどんどん追加していきたいものである。

この記事が気に入ったらサポートをしてみませんか?