C++の勉強備忘録
macでC++(+SDL2)環境構築
上記の本のサンプルコードをmacで動かすため、IDEはCLionを選択。
下の動画に沿って環境構築した。
VSCodeよりもパッケージの管理が圧倒的に楽だった。
- CLionでSDL2を動かす
文法 C++ポインタ
基本
int x = 5;
int* p1, p2;
p1 = &x; // p1 is a pointer, p2 is an int
p2 = x;
int* p
、 int *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
ここに解答を上げていくことに。
- 全探索
- ビット全探索
- 二分探索
- 累積和
- 動的計画法(の基本)
をやった。