Closed8

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[] 形式に戻そうという気持ちがある。

参考: https://atcoder.jp/contests/apg4b/tasks/APG4b_n

こどはざこどはざ

二次元配列の宣言

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つ候補があった。

  1. Microsoft Unit Testing Framework for C++
  2. Google Test
  3. Boost.test
  4. CTest

参考: https://learn.microsoft.com/en-us/visualstudio/test/writing-unit-tests-for-c-cpp?view=vs-2022

AtCoderをやる上ではstdinでデータを受け取るコードを書くため、テストフレームワークは無くてもいいかなという感想。
また丁寧なテストケースを書いて自身のテスト力を底上げする考えも起きたが、それは別で学べば良いし、自身の用途では現状不要と判断した。

このスクラップは2023/10/11にクローズされました