C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のstd::vectorとstd::arrayの違いとは?特徴と使い分けを徹底解説

C++には、複数の値をまとめて管理できるコンテナとして std::vectorstd::array が用意されています。一見似ていますが、内部構造や動作には重要な違いがあり、それぞれ得意な場面が異なります。この記事では、両者の主な違い、宣言と初期化の基本構文、そして実際に動作するサンプルコードを交えながら、わかりやすく解説します。

std::vectorとstd::arrayの主な違い

比較項目std::vectorstd::array
サイズ動的(要素の追加で自動拡張)固定(宣言時に決定)
メモリ消費やや多い少ない(効率的)
要素アクセス高速だが僅かなオーバーヘッドあり常に一定時間(O(1))
必要なヘッダ<vector><array>
  • vector は要素を格納するためのシーケンシャルコンテナであり、インデックスベースではありません。
  • array は同じ型の要素を固定サイズで順に格納するコレクションで、インデックスベースです。
  • vector は動的な性質を持つため、要素を挿入するとサイズが自動的に拡張されます。
  • array は固定サイズのため、一度初期化した後はサイズを変更できません。
  • vector は内部管理用の情報を保持するため、より多くのメモリを占有します。
  • array はメモリ効率に優れたデータ構造です。
  • vector は要素へのアクセスに比較的多くの時間を要することがあります。
  • array は要素が連続したメモリ領域に配置されるため、位置にかかわらず一定時間でアクセスできます。

宣言と初期化の構文

vector と array は、それぞれ次のような構文で宣言・初期化できます。

// vector の宣言
vector<datatype> vec_name;

// array の宣言
type array_name[array_size];

// vector の初期化
vector<datatype> vec_name = {values};

// array の初期化
datatype array_name[array_size] = {values};

std::vector のサンプルコード

以下は、2次元の vector を作成して全要素を表示する例です。vector は可変長なので、行ごとに要素数が異なるデータでもそのまま扱える点が大きな特徴です。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    // 2次元vectorの宣言と初期化
    vector<vector<int>> v{ { 4, 5, 3 }, { 2, 7, 6 }, { 3, 2, 1, 10 } };
    cout << "the 2D vector is:" << endl;

    // 全要素を走査して出力
    for (int i = 0; i < v.size(); i++) {
        for (int j = 0; j < v[i].size(); j++)
            cout << v[i][j] << " ";
        cout << endl;
    }
    return 0;
}

実行結果

the 2D vector is:
4 5 3
2 7 6
3 2 1 10

std::array のサンプルコード

次に、std::array を使った例です。size() や max_size()、at()、fill() など、std::array が提供する代表的なメンバ関数の使い方を確認できます。

#include <iostream>
#include <array>
using namespace std;

int main() {
    // サイズ4のarrayを宣言・初期化
    array<int,4> a = {10, 20, 30, 40};

    cout << "The size of array is : ";
    // size() で要素数を取得
    cout << a.size() << endl;

    cout << "Maximum number of elements array can hold is : ";
    // 格納可能な最大要素数
    cout << a.max_size() << endl;

    cout << "The array elements are (using at()) : ";
    // at() を使って各要素を表示
    for (int i = 0; i < 4; i++)
        cout << a.at(i) << " ";
    cout << endl;

    // 全要素を1で埋める
    a.fill(1);

    cout << "Array after filling operation is : ";
    // fill() 後の配列を表示
    for (int i = 0; i < 4; i++)
        cout << a[i] << " ";

    return 0;
}

実行結果

The size of array is : 4
Maximum number of elements array can hold is : 4
The array elements are (using at()) : 10 20 30 40
Array after filling operation is : 1 1 1 1

まとめ:使い分けのポイント

std::vector と std::array は、それぞれ次のような場面で活躍します。

  • std::array が向いているケース:要素数があらかじめ決まっていて変更不要な場合や、メモリ効率・アクセス速度を重視したい場合。
  • std::vector が向いているケース:実行時に要素数が増減する可能性がある場合や、柔軟に要素を追加・削除したい場合。

サイズの固定性・メモリ効率・アクセス性能といった観点から両者を比較し、プログラムの要件に合ったコンテナを選択することで、より安全で効率的なC++プログラムを実現できます。

  1. C++の比較演算子(==)とstd::string::compare()の違いを徹底解説

    C++の比較演算子(==)とstd::string::compare()の違いとは? C++で文字列を比較する方法として、比較演算子 == と std::string::compare() の2つがあります。結論から言うと、この2つの違いは戻り値だけです。実際、string::operator==() は内部的に string::compare() を呼び出して実装されています。 戻り値の違い 比較演算子(==)は、2つの文字列が等しいかどうかを示す bool 型の値(true / false)を返します。一方、compare() は、2つの文字列が互いにどのような関係にあるかを示す int

  2. C++におけるendlと\nの違いとは?パフォーマンスを意識した使い分けのポイント

    C++の改行出力:endlと\nの基本的な違い C++で標準出力に改行を出力する方法として、主に「\\n」と「std::endl」の2つが使われます。一見どちらも同じように見えますが、内部動作には重要な違いがあります。 \\n の特徴 \\nは単純に改行文字を出力します。この際、改行コードはプラットフォーム固有の表現に変換されます。たとえばWindows環境では、自動的に「\\r\\n(キャリッジリターン+ラインフィード)」として扱われます。 std::endl の特徴 std::endlも同様に改行を出力しますが、それに加えてストリームのフラッシュ(バッファの強制書き出し)を行う点が異なりま