配列([N]T)の基本
『Zig』では、配列は固定長のデータ構造です。型は『[N]T』の形式で表し、『N』が要素数、『T』が要素の型を指定します。コンパイル時に長さが確定するため、スタック上に効率よく確保されます。ここでは、固定長配列の宣言・要素へのアクセス・初期化の方法を解説します。
構文
// -----------------------------------------------
// 固定長配列の宣言と初期化
// -----------------------------------------------
// [N]T 型リテラルで初期化します
// N: 要素数(コンパイル時定数)
// T: 要素の型
const arr: [N]T = [N]T{ 値1, 値2, ... };
// 要素数を _ で省略できます(リテラルから推論されます)
const arr = [_]T{ 値1, 値2, ... };
// -----------------------------------------------
// 要素へのアクセス
// -----------------------------------------------
arr[インデックス] // 0 始まりのインデックスで要素を取得します
arr[インデックス] = 値; // var 宣言の場合のみ代入できます(const は不可)
// -----------------------------------------------
// 配列の長さ取得
// -----------------------------------------------
arr.len // 配列の要素数を返します(usize 型)
// -----------------------------------------------
// ゼロ初期化
// -----------------------------------------------
var arr = [_]T{ 0 } ** N; // すべての要素を 0 で初期化します(** は繰り返し演算子)
構文一覧
| 構文/メソッド | 概要 |
|---|---|
[N]T{ ... } | 要素数 N、型 T の固定長配列リテラルを定義します。 |
[_]T{ ... } | 要素数をリテラルから推論して固定長配列を定義します。 |
arr[i] | インデックス『i』の要素を取得します。0 始まりです。 |
arr[i] = 値 | 『var』宣言の配列のインデックス『i』に値を代入します。 |
arr.len | 配列の要素数を『usize』型で返します。 |
値 ** N | 値またはシングル要素配列を N 回繰り返した配列を生成します。 |
arr[start..end] | インデックス『start』から『end』(不含)までのスライスを生成します。 |
arr[0..] | 配列全体のスライスを生成します。 |
サンプルコード
psychopass_array.zig
// psychopass_array.zig — 固定長配列の宣言・アクセス・初期化のサンプルです
// PSYCHO-PASS のキャラクターを使って
// [N]T 型配列の基本操作を確認します
// 標準ライブラリをインポートします
const std = @import("std");
pub fn main() !void {
// 標準出力への Writer を取得します
const stdout = std.io.getStdOut().writer();
// -----------------------------------------------
// 1. const 配列の宣言と初期化
// -----------------------------------------------
// [_] を使うと要素数をコンパイラが推論します(ここでは 5 になります)
const inspectors = [_][]const u8{
"常守朱", // インデックス 0
"宜野座伸元", // インデックス 1
"狡噛慎也", // インデックス 2
"征陸智己", // インデックス 3
"唐之杜志恩", // インデックス 4
};
try stdout.print("=== PSYCHO-PASS 執行官・監視官一覧 ===\n\n", .{});
// .len プロパティで要素数を取得します
try stdout.print("登録人数: {d} 名\n\n", .{inspectors.len});
// インデックスで個別アクセスします
try stdout.print("監視官: {s}\n", .{inspectors[0]});
try stdout.print("執行官(元監視官): {s}\n\n", .{inspectors[2]});
// -----------------------------------------------
// 2. for 文で全要素を順に処理します
// -----------------------------------------------
try stdout.print("--- 全メンバー ---\n", .{});
for (inspectors, 0..) |name, i| {
// {d} は整数の 10 進数表示、{s} は文字列表示です
try stdout.print(" [{d}] {s}\n", .{ i, name });
}
try stdout.print("\n", .{});
// -----------------------------------------------
// 3. var 配列への代入
// -----------------------------------------------
// ** 演算子でゼロ初期化した配列を作ります
// 犯罪係数(0〜299 の範囲)を格納します
var crime_coefficients = [_]u16{0} ** 5;
// 各インデックスに値を代入します(var 宣言なので書き換えできます)
crime_coefficients[0] = 28; // 常守朱
crime_coefficients[1] = 42; // 宜野座伸元
crime_coefficients[2] = 136; // 狡噛慎也
crime_coefficients[3] = 98; // 征陸智己
crime_coefficients[4] = 55; // 唐之杜志恩
try stdout.print("--- 犯罪係数 ---\n", .{});
for (inspectors, crime_coefficients) |name, coeff| {
try stdout.print(" {s}: {d}\n", .{ name, coeff });
}
try stdout.print("\n", .{});
// -----------------------------------------------
// 4. スライスで部分範囲にアクセスします
// -----------------------------------------------
// arr[start..end] で start 以上 end 未満の要素を参照できます
const field_team = inspectors[0..2]; // 常守朱・宜野座伸元
try stdout.print("--- フィールド担当(先頭 2 名)---\n", .{});
for (field_team) |name| {
try stdout.print(" {s}\n", .{name});
}
}
zig run psychopass_array.zig === PSYCHO-PASS 執行官・監視官一覧 === 登録人数: 5 名 監視官: 常守朱 執行官(元監視官): 狡噛慎也 --- 全メンバー --- [0] 常守朱 [1] 宜野座伸元 [2] 狡噛慎也 [3] 征陸智己 [4] 唐之杜志恩 --- 犯罪係数 --- 常守朱: 28 宜野座伸元: 42 狡噛慎也: 136 征陸智己: 98 唐之杜志恩: 55 --- フィールド担当(先頭 2 名)--- 常守朱 宜野座伸元
概要
『Zig』の固定長配列は『[N]T』型で表します。『N』はコンパイル時定数の要素数、『T』は要素の型です。配列リテラルで初期化する際、要素数を明示する代わりに『[_]T』と書けばコンパイラが自動的に推論します。要素へのアクセスは『arr[i]』(0 始まり)で行い、要素数は『arr.len』で取得できます。『const』宣言の配列は要素の書き換えができませんが、『var』宣言では『arr[i] = 値』で代入できます。ゼロ初期化には繰り返し演算子『**』を使った『[_]T{0} ** N』が便利です。配列の一部を参照したい場合は『arr[start..end]』でスライスを生成できます。可変長が必要な場合は ArrayList(動的配列) を、多次元配列については 多次元配列 を合わせて確認してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。