コンテンツにスキップ

2. 配列を使う

2.1 配列

  • Array<T>T 型の配列です
  • 配列は 1 つの変数でたくさんの値を持つことができます
  • 配列の中身は Print << 配列;U"{}"_fmt(配列) で調べることができます

# include <Siv3D.hpp>

void Main()
{
	Scene::SetBackground(ColorF{ 0.8, 0.9, 1.0 });

	Font font{ FontMethod::MSDF, 48 };

	// 6 つの要素を持つ配列
	Array<int32> values = { 10, 20, 50, 100, 200, 500 };

	while (System::Update())
	{
		font(U"values: {}"_fmt(values)).draw(20, 40, 40, Palette::Black);
	}
}

2.2 配列への要素の追加

  • << を使って配列の末尾に要素を追加できます

# include <Siv3D.hpp>

void Main()
{
	Scene::SetBackground(ColorF{ 0.8, 0.9, 1.0 });

	Font font{ FontMethod::MSDF, 48 };

	// 最初は要素無し
	Array<int32> values;

	while (System::Update())
	{
		if (MouseL.down())
		{
			values << Random(0, 100);
		}

		font(U"values: {}"_fmt(values)).draw(20, 40, 40, Palette::Black);
	}
}

2.3 配列の要素数

  • 現在の配列の要素数は .size() で調べられます

# include <Siv3D.hpp>

void Main()
{
	Scene::SetBackground(ColorF{ 0.8, 0.9, 1.0 });

	Font font{ FontMethod::MSDF, 48 };

	Array<int32> values;

	while (System::Update())
	{
		if (MouseL.down())
		{
			values << Random(0, 100);
		}

		font(U"values: {}"_fmt(values)).draw(20, 40, 40, Palette::Black);

		font(U"要素数: {}"_fmt(values.size())).draw(20, 40, 80, Palette::Black);
	}
}

2.4 配列の末尾の要素の削除

  • 配列の末尾の要素を削除するには .pop_back() を使います
  • 配列の要素数が 0 のときに .pop_back() はできません

# include <Siv3D.hpp>

void Main()
{
	Scene::SetBackground(ColorF{ 0.8, 0.9, 1.0 });

	Font font{ FontMethod::MSDF, 48 };

	Array<int32> values;

	while (System::Update())
	{
		if (MouseL.down())
		{
			values << Random(0, 100);
		}

		if (MouseR.down()
			&& (0 < values.size())) // もし 1 個でも要素があれば
		{
			// 末尾の要素を削除する
			values.pop_back();
		}

		font(U"values: {}"_fmt(values)).draw(20, 40, 40, Palette::Black);

		font(U"要素数: {}"_fmt(values.size())).draw(20, 40, 80, Palette::Black);
	}
}

2.5 配列のすべての要素の削除

  • 配列のすべての要素を削除するには .clear() を使います
  • 配列の要素数が 0 のときに使っても何も起こりません

# include <Siv3D.hpp>

void Main()
{
	Scene::SetBackground(ColorF{ 0.8, 0.9, 1.0 });

	Font font{ FontMethod::MSDF, 48 };

	Array<int32> values;

	while (System::Update())
	{
		if (MouseL.down())
		{
			values << Random(0, 100);
		}

		if (MouseR.down()
			&& (0 < values.size())) // もし 1 個でも要素があれば
		{
			// 末尾の要素を削除する
			values.pop_back();
		}

		if (KeySpace.down())
		{
			// すべての要素を削除する
			values.clear();
		}

		font(U"values: {}"_fmt(values)).draw(20, 40, 40, Palette::Black);

		font(U"要素数: {}"_fmt(values.size())).draw(20, 40, 80, Palette::Black);
	}
}

2.6 範囲 for (const 参照)

  • 次のような範囲 for 文で、配列のすべての要素にアクセスできます

# include <Siv3D.hpp>

void Main()
{
	Array<int32> values = { 10, 20, 30, 40, 50, 60 };

	for (const auto& value : values)
	{
		Print << (value * 2);
	}

	while (System::Update())
	{

	}
}

2.7 範囲 for (参照)

  • 次のような範囲 for 文で、配列のすべての要素にアクセスでき、要素を変更できます

# include <Siv3D.hpp>

void Main()
{
	Array<int32> values = { 10, 20, 30, 40, 50, 60 };

	for (auto& value : values)
	{
		value += 2;
	}

	for (const auto& value : values)
	{
		Print << value;
	}

	while (System::Update())
	{

	}
}

2.8 範囲 for 内で、その配列に要素の追加と削除をしてはいけない

  • 範囲 for 内で、その配列に対して要素の追加と削除をすることはできません

書いてはいけないコード(範囲 for 内でその配列に要素を追加している)

# include <Siv3D.hpp>

void Main()
{
	Array<int32> values = { 10, 20, 30, 40, 50, 60 };

	for (const auto& value : values)
	{
		Print << value;

		values << 100;
	}

	while (System::Update())
	{

	}
}

書いてはいけないコード(範囲 for 内でその配列の要素を削除している)

# include <Siv3D.hpp>

void Main()
{
	Array<int32> values = { 10, 20, 30, 40, 50, 60 };

	for (const auto& value : values)
	{
		Print << value;

		if (values)
		{
			values.pop_back();
		}
	}

	while (System::Update())
	{

	}
}