AtCoder C++入門の覚え書き #1 配列宣言、多重for文の抜け方、テストツール
配列
配列宣言は3種あり、値にアクセスする方法は2種ある。
int arr[配列長]; // ①Cの配列
vector arr(配列長, 初期値); // ②vectorの配列。AtCoderの記事で競プロにおいて推奨
array<int, 配列長> arr; // ③arrayの配列
// JSなどで慣れ親しんだアクセス法
arr[1];
/* やや冗長だが、インデックスが配列長を超えている際にエラーを返してくれるため推奨 */
/* ①Cの配列では使えない */
arr.at(1);
vector
が推奨されているが、まだ慣れていないので隙あらば arr[]
形式に戻そうという気持ちがある。
二次元配列の宣言
vector<vector<int>> arr(行要素数, vector<int>(列要素数, 列初期値));
分かりづらいが、 変数名(要素数, 初期値)
の初期値の部分が vector<int>(列要素数)
で初期化されていると考えると理解しやすい。
なお列要素を初期値として指定せず、また各行の長さをバラバラにすることもできる(ジャグ配列: jagged arrayと呼ばれる)
vector<vector<int>> arr(2);
arr.at(0).push_back(1);
arr.at(0).push_back(2);
arr.at(1).push_back(3);
arr.at(1).push_back(4);
arr.at(1).push_back(5);
for文
for文で配列をループさせる場合 auto
が便利。
for (auto i: arr) {
std::cout << i << std::endl;
}
範囲for文
というC++の構文機能だった。
前例では型宣言を auto
で自動化できていたということ。
コンテナ
と呼ばれるデータ型をループできるらしい。
for (型名 変数名: 配列名) {
}
while
for
range-based for
の使い分け。
- range-based for: 配列全体を処理したい場合
- for: N回の特定処理を実行したい場合
- while: それ以外の場合
配列の sort()
と reverse()
には、それぞれ開始地点と終了地点を arr.begin()
と arr.end()
で渡す。
vector<int> arr = { 1, 7, 3, 4, 0 };
sort(arr.begin(), arr.end());
reverse(arr.begin(), arr.end());
TypeScript等ではコストが掛かるが、C++は低レベルなので競プロだとそのまま使えそう。
多重ループの抜け方
break
では2重/多重ループを一度に抜けることは出来ない。
LABEL:
と goto
で抜けることは出来るがコードが不要に複雑になるので推奨されない。
一度に抜けたければ関数化して return
するテクニックを使う。
void exec() {
for () {
for () {
if (条件) {
return;
}
}
}
}
テスト
C++のテストフレームワークについて調べた。VSCodeでやる場合4つ候補があった。
- Microsoft Unit Testing Framework for C++
- Google Test
- Boost.test
- CTest
参考: https://learn.microsoft.com/en-us/visualstudio/test/writing-unit-tests-for-c-cpp?view=vs-2022
AtCoderをやる上ではstdinでデータを受け取るコードを書くため、テストフレームワークは無くてもいいかなという感想。
また丁寧なテストケースを書いて自身のテスト力を底上げする考えも起きたが、それは別で学べば良いし、自身の用途では現状不要と判断した。