C++の勉強(環境構築・競プロ)

C++の勉強備忘録

macでC++(+SDL2)環境構築

ゲームプログラミングC++

上記の本のサンプルコードをmacで動かすため、IDEはCLionを選択。
下の動画に沿って環境構築した。
VSCodeよりもパッケージの管理が圧倒的に楽だった。

文法 C++ポインタ

基本

int x = 5;
int* p1, p2;
p1 = &x;     // p1 is a pointer, p2 is an int
p2 = x;

int* pint *p どちらで書いても意味は同じだけど
int* p1, p2; これはp1がポインタ、p2がintとして解釈されてしまう。

逆参照

ポインタが示す値を読み取るには以下のように書く

// 逆参照
*p1 = 100; // 書き換え

int y = *p1; // 取得
cout << y << "," << p2 << endl;

また、const をつける位置によって
値とポインタのどちらを書き換えられないかが変わる。

// 値を書き換えられないパターン
int a = 123;
const int *p = &a;
// これは不可
// *p = 456;

// ポインタ自体を書き換えられないパターン
int b = 456;
int *const q = &b;
// これは不可
// q = &a;

const

これと配列を組み合わせて使うと、C#で言うところのIReadOnlyListのように
配列の中身を書き換えさせないといったことができる。

関数の宣言側

extern DECLSPEC const Uint8 *SDLCALL SDL_GetKeyboardState(int *numkeys);

呼び出し側

const Uint8 *state = SDL_GetKeyboardState(nullptr);

配列とポインタ

ポインタ型に暗黙変化される。したの例ではnにはarrの先頭ポインタが入る

// 配列とポインタ
int arr[] = {10, 20, 30, 40};
int *n = arr;
cout << *p << endl;
cout << *n << endl; // 10
cout << *(n + 1) << endl; // 20
cout << *(n + 2) << endl; // 30

また、これの応用で
sortでリストのある範囲だけをソートする、といった使い方ができる。

int N = 100009;
int A[N];
for (int i = 1; i <= N; i++)
{
    cin >> A[i];
}
sort(A + 1, A + N + 1);

これでリストAのインデックス1 ~ Nの範囲をソートできる。

vecorとポインタ

vector.data()で先頭要素のポインタを取得できる

vector<int> v = {4, 3, 2, 1, 0};
int *px = v.data(); // 先頭ポインタ
int num = *px;
cout << num << endl; // 4

競技プログラミングの鉄則

https://github.com/akira-fujii/learning-cpp/tree/main

ここに解答を上げていくことに。

  • 全探索
    • ビット全探索
  • 二分探索
  • 累積和
  • 動的計画法(の基本)

をやった。

Published At (Updated At)
Tagged with