皆さんこんにちは。新人の網田です。
今回は僕が競プロに挑戦するために勉強した話を書いていこうと思います。
競プロを聞いたことがない方、C++ってどんな言語?と気になっている方、必見です!
競プロって?
競プロ:「競技プログラミング」とは、制限時間内に与えられた課題をプログラミングで解決する競技です。
個人的には「プログラミングをやってみたいけど、作りたいものが思いつかない」という方にお勧めです!
競プロにはAtcoderやTopCoderなどがあり、日本ではAtcoderが最大手です。
競技プログラミングの詳細については下の記事を見てみてください。
競技プログラミングとは?問題例や参加方法なども解説! (sint.co.jp)
弊社が運営しているTOPSICというサービスでも、プログラミングコンテストに参加することができます。ほかにもSQLの学習やAtCoderの過去問などにも取り組めます!
また、競プロではどのプログラミング言語を使用するかで問題を制限時間内にクリアすることができるかが変わってきます。
中でもプログラムの実行速度が速くて有利なのが「C++」(諸説あります)
今回、競技プログラミングのためにC++をざっと勉強しました!
どうして競プロをやりたいの?
ひとつは「もともと興味があったから」です。学生時代はプログラミングをしても外に出さないことがほとんどでしたが、AtCoderではプログラミング力を他人と競い、高めることができます。この部分にひかれていました。
そして一番大きな理由はシステムインテグレータの社内イベントです。
弊社では社内イベントとして、毎年プログラミングコンテストを実施しています。
前年のプログラミングコンテストでは、優勝・準優勝・第三位、そして良い成績を収めた新人を対象に賞が出されました😆
優しい先輩に質問ができ、同期と切磋琢磨し、そして社内イベントというモチベーション要因(賞)もある。
多くの幸運が重なって、僕は競プロに挑戦することを決めました。
このブログでは、僕が競プロのためにC++を勉強する中で大切だと感じた部分を抜粋したものです。
僕と同じように競プロ・C++をやってみたいと思っている方、このブログを読んで挑戦の足掛かりにでもしてください!
C++ってなに?
C++(シープラ、シープラプラ、シープラスプラス)はC言語の完全上位互換として開発された言語です。
C言語にオブジェクト指向や例外処理など様々な機能が追加されています。
C++の特徴は?
私がC++を勉強する中で、感じた特徴は次の5つです。
ちなみに、私は大学時代Pythonを主に使っていたので、Pythonと比較しての特徴になります。
- 型の宣言が必須
- ポインタ
- 標準入出力
- #include
- アクセス指定子
型の宣言が必須
int x = 10;
C++は静的型付け言語なので、変数を作るときに型が必須になります!
Pythonでは型を書かなくてもよかったので気を付けないといけません。
あと、文末にセミコロンをつけるのも忘れないようにしましょう!
ポインタ
でました!ポインタ!
存在は知っていましたが実際に扱うのは初めてです。
ざっくりいうと「変数をアドレスで管理するためのもの」でしょうか。
主に配列を扱う際に役に立ちそうです。
int x = 5;
int* p = &x;
int y = *p; // 5
int* np = nullptr;
変数のアドレスを取得したり、逆にアドレスから変数を取得するには*や&をつけるみたいですね。nullptrは使わない変数を削除するときに使えそうです。
int x[] = {2, 4, 6, 8, 10};
int* p = x;
std::cout << *p << std::endl; // 2
std::cout << *(p + 1) << std::endl; // 4
std::cout << *(p + 2) << std::endl; // 6
std::cout << *(p + 3) << std::endl; // 8
std::cout << *(p + 4) << std::endl; // 10
特に配列のポインタ操作はすごい!
C++の配列は要素を並べておくからでしょうか、ポインタに+1追加することで一つ隣の要素にアクセスすることができます!
ほかにも関数の引数が一部ポインタとして解釈されたり、ディープコピーとシャローコピーに関係してきたりなど、ポインタは奥が深そうです。
標準入出力
Pythonではprint関数やinput関数などを使って標準入出力を扱うのが主でした。
C++でもprint関数はありますが、 「<<」「>>」を使うみたいです。
cout << 'Hello World' << endl;
cin >> word;
coutは標準出力、cinは標準入力です。(多分)
<<や>>で、流し込むイメージですね。
#include
#includeはPythonでいうimportに近い概念だと思います。
ほかのファイルで定義した関数や定数を使えるようにしたり、実装済みの機能を使えるようにしたりできます。
#include <std>
#include <iostream>
#include <array>
#include <string>
coutやcin、配列、文字列などはインクルードをしないと使えないので注意です!
アクセス指定子
クラスのメンバ(変数やメソッド)がどこからならアクセスできるかを決めるのがアクセス指定子です。(クラスだけでなくグローバル変数なども対象かもしれない…)
各アクセス指定子の効果は次の表のとおりです。
アクセス指定子 | 自クラス | 継承したクラス | その他 |
public | 〇 | 〇 | 〇 |
protected | 〇 | 〇 | × |
private | 〇 | × | × |
おわりに
今回は競技プログラミングのためにC++を勉強しました!
型やポインタなど、Pythonではあまり見なかった概念がたくさんありましたね。もちろん今回のブログで紹介できなかったものもたくさんあります。
しかし、これでようやく競プロに挑戦する準備ができました!
今から競プロでプログラミング力を鍛えにいってきます!
では、このへんで。