C++で競プロ(メモ)

Pythonメインでやってきましたが,C++でもできるようになりたいと思い始めました.
主な理由は以下:

  • 順序付集合など,Pythonが苦手とする処理がある(順序付集合 - 競プロはじめました
  • C++のコードが読めるようになると,参考にできる情報の幅が広がる(例えば蟻本はC++)


コンテストのたびに,できるだけC++版でもコードを書くようにして身につけたいと思います.

はじめのうちは,基本的な事項をこのページにメモしていこうと思います.以下のC++版のイメージ:AtCoder - 解法パターンの整理 - 競プロはじめました

参考


入力

変数で受け取る

A B
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int A, B;
  cin >> A >> B;
}

配列で受け取る

N
A1 A2 ... AN
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int N;
  cin >> N;
  vector<int> A(N);
  for (int i = 0; i < N; i++) {
    cin >> A.at(i);
  }
}

出力

数値型

【参考】

long long型

int型は20億(2 * 10^9)くらいまで.それより大きな値はint64_t型を使う.
整数の末尾にLLをつけるとint64_t型になる.

宣言は例えば次のようにする.

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main() {
  int n; ll k;
  cin >> n >> k;
}


配列

【参考】

初期化

1次元の場合はvector<要素の型> 変数名(要素数, 初期値)

初期値を省略すると,intの場合は全ての要素が0で初期化される.

vector<int> vec(3);

は次とほとんど同じ意味になる.

vector<int> vec = {0, 0, 0};

多次元

1次元の要素をvectorにすれば2次元配列になる.
  • 1次元:vector<要素の型> 変数名(要素数, 初期値)
  • 2次元:↑の「要素の型vector<要素の型>」,↑の「初期値vector<要素の型>(要素数, 初期値)

降順ソート

#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> vec = {2, 5, 2, 1};
    sort(vec.begin(), vec.end()); // {1, 2, 2, 5}
    reverse(vec.begin(), vec.end()); // {5, 2, 2, 1}
    }
}

範囲for文

#include <bits/stdc++.h>
using namespace std;

int main() {
  vector<int> a = {1, 3, 2, 5};
  for (int x : a) {
    cout << x << endl;
  }
}

文字列

範囲for文

#include <bits/stdc++.h>
using namespace std;

int main() {
  string str = "hello";
  for (char c : str) {
    cout << c << endl;
  }
}