【C++】配列とvectorの違いとは?|どっちを使うべきかコードで比較

サムネイル画像 C++

今回は、C++でよく出てくる「配列とvectorの違い」について解説していきます。

「配列とvectorって何が違うの?」
「結局どっちを使えばいいの?」
「初心者はvectorを使った方がいいって本当?」

こんな疑問はありませんか?

配列もvectorも、どちらも複数のデータをまとめて扱うためのものです。ですが、要素数を後から変えられるかどうかなど、実際にはかなり大きな違いがあります。

この記事を読み終えると、あなたは配列とvectorの意味・違い・使い分け・初心者がハマりやすいミスをしっかり理解できるようになると思いますので、ぜひ最後まで読んでいただけると嬉しいです。

配列とvectorの違いとは?

まず結論からいうと、配列は要素数が固定vectorは要素数を後から増減できる、という違いがあります。

  • 配列:最初に決めた個数で使う
  • vector:必要に応じて追加・削除しやすい
  • 配列:C++のメモリ感覚を学びやすい
  • vector:実践でかなり使いやすい

特にC++初心者のうちは、「固定なら配列」「増減するならvector」と覚えておくとかなり分かりやすいです。

なぜ配列とvectorの違いを理解する必要がある?

ゲーム制作やアプリ開発では、敵の数、弾の数、アイテムの数など、途中で増えたり減ったりするデータがかなり多いです。

この時に最初から配列で作ってしまうと、「上限を何個にするか」「削除した後の空き要素をどうするか」といった管理が面倒になりやすいです。一方でvectorなら、push_backで追加でき、size()で個数も確認しやすいので、かなり扱いやすくなります。

また、配列は見た目がシンプルですが、関数に渡すとポインタとして扱われるなど、初心者が混乱しやすいポイントもあります。配列とポインタの関係が気になる方は、ポインタの記事sizeofの記事もあわせて読むと理解しやすいです。

配列の基本的な使い方

まずは一番シンプルな配列の例を見てみましょう。配列は最初に個数を決めて使います。

▼main.cpp


#include <iostream>

int main() {
    int scores[3] = { 10, 20, 30 };

    for (int i = 0; i < 3; ++i) {
        std::cout << scores[i] << "\n";
    }

    return 0;
}

実行結果

10
20
30

このように、配列は書き方がシンプルです。ただし、3個で作ったら基本的には3個のまま使います。途中で気軽に4個、5個と増やしたい場面には向きません。

vectorの基本的な使い方

次にvectorです。vectorを使うには #include <vector> が必要です。vectorは後から要素を追加しやすいのが大きな強みです。

▼main.cpp


#include <iostream>
#include <vector>

int main() {
    std::vector<int> scores;

    scores.push_back(10);
    scores.push_back(20);
    scores.push_back(30);

    for (int i = 0; i < static_cast<int>(scores.size()); ++i) {
        std::cout << scores[i] << "\n";
    }

    return 0;
}

実行結果

10
20
30

出力結果は配列と同じですが、vectorは途中で要素を追加できるのが便利です。ループ処理にまだ不安がある方は、for文とwhile文の違いもあわせて読むと理解しやすいです。

結局どっちを使うべき?

基本的には、次のように考えるとかなり分かりやすいです。

  • 個数が最初から決まっていて変わらない → 配列
  • 個数が途中で増えたり減ったりする → vector
  • 初心者がまず安全に扱いたい → vector寄り
  • C++の基礎をしっかり理解したい → 配列も理解しておく

実際の開発では、可変長データを扱う場面がかなり多いので、迷ったらvectorを選ぶ場面はかなり多いです。

【重要】私が実際に配列とvectorで困った体験談

私も自主制作のゲームを作っていた時に、敵リストを最初は固定長配列で管理していました。「1ステージに出る敵は最大20体くらいだろう」と思っていたからです。

ですが、途中で仕様を変えて「敵の追加出現」や「特定条件で増援が来る」仕組みを入れた時に、一気に管理が面倒になりました。倒された敵の場所をどう再利用するか、今どこまで埋まっているのか、配列の範囲外に触っていないか、毎回かなり気を使うことになりました。

その時にvectorへ切り替えたところ、追加処理や個数管理がかなり分かりやすくなりました。もちろん配列にも良さはありますが、「後から増減する可能性があるなら、最初からvectorを選ぶ方が楽」だとかなり実感しました。

配列とvector使用時のよくある失敗例と対処法

1. 配列の範囲外アクセスをしてしまう

配列は固定長なので、存在しない添字にアクセスすると危険です。

  • 失敗例:3個しかないのに scores[3]scores[5] を読む
  • 対処法:要素数を必ず意識し、ループ条件を丁寧に書く

2. vectorなのに配列と同じ感覚で扱ってしまう

vectorの個数確認は size() を使います。配列と同じ感覚で固定数を前提に書くと、後でデータ追加時にズレやすいです。

  • 失敗例:ループ回数を固定で書いてしまう
  • 対処法:vectorでは size() を使って回す

3. 途中で増えるデータなのに最初から配列で作ってしまう

最初は固定個数でも、後から仕様変更が入ることはかなり多いです。

  • 失敗例:持ち物や敵リストを固定長配列で作る
  • 対処法:増減の可能性があるなら最初からvectorを検討する

実践例:敵の名前を管理するならvectorが便利

たとえば、ステージの進行に応じて敵を追加したいなら、vectorの方がかなり自然に書けます。

▼main.cpp


#include <iostream>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> enemies;

    enemies.push_back("Slime");
    enemies.push_back("Goblin");
    enemies.push_back("Dragon");

    for (int i = 0; i < static_cast<int>(enemies.size()); ++i) {
        std::cout << enemies[i] << "\n";
    }

    return 0;
}

実行結果

Slime
Goblin
Dragon

こういう「あとから増えるかもしれないデータ」は、配列よりvectorの方がかなり扱いやすいです。もし「思った通りに中身が入っていない」「どこで値がズレたか分からない」といった時は、Visual Studioでのデバッグ方法もかなり役立ちます。

注意点

  • 配列は固定長なので、要素数を超えないように注意する
  • vectorは便利ですが、何でもかんでも使えばいいわけではない
  • 個数が絶対に変わらないデータなら、配列の方がシンプルなこともある
  • 速度だけで決めるのではなく、管理しやすさ・保守しやすさも意識する

個人的には、初心者のうちは「まずvectorを使いながら、配列の基礎も理解していく」のがおすすめです。この順番の方が、実際の開発でもつまずきにくいと思います。

まとめ

  • 配列は要素数が固定、vectorは要素数を増減できる
  • 固定データなら配列、可変データならvectorが基本
  • 初心者が実用面で使いやすいのはvector
  • ただし、配列の考え方もC++の基礎としてかなり重要
  • 迷ったら「後で増える可能性があるか」を基準に考えると判断しやすい

配列とvectorは、どちらか一方だけ覚えればいいわけではありません。違いを理解して使い分けられるようになると、C++のコードはかなり書きやすくなります。

関連記事