vector

[C++] vectorの二次元配列を引数として渡す方法

C++で二次元配列を関数の引数として渡す際には、std::vectorを使用することが一般的です。

二次元配列はstd::vector<std::vector<T>>の形式で定義されます。

関数の引数として渡す場合、通常はconst std::vector<std::vector<T>>&のように参照を使うことで、コピーを避け効率的にデータを渡すことができます。

この方法により、配列のサイズを動的に変更できる利点も享受できます。

vectorの二次元配列を関数に渡す方法

関数の宣言と定義

C++でvectorの二次元配列を関数に渡す際には、関数の宣言と定義が重要です。

以下のポイントに注意して設計します。

  • 関数の引数: std::vector<std::vector<int>>のように、二次元配列を表現するvectorを引数に取ります。
  • 戻り値: 必要に応じて、関数の戻り値を設定します。

例えば、計算結果を返す場合などです。

#include <iostream>
#include <vector>
// 二次元配列を受け取る関数の宣言
void printMatrix(const std::vector<std::vector<int>>& matrix);

参照渡しと値渡しの違い

vectorの二次元配列を関数に渡す際、参照渡しと値渡しの違いを理解することが重要です。

  • 参照渡し: 関数に渡された配列の実体を操作します。

メモリ効率が良く、オーバーヘッドが少ないです。

  • 値渡し: 配列のコピーを作成し、関数内で操作します。

元の配列は変更されませんが、メモリを多く消費します。

渡し方特徴
参照渡しメモリ効率が良い、元のデータを変更可能
値渡し元のデータを変更しない、メモリ消費が多い

const修飾子の使用

const修飾子を使用することで、関数内で配列を変更しないことを保証できます。

これにより、意図しない変更を防ぎ、コードの安全性を高めます。

// const修飾子を使用した関数の宣言
void printMatrix(const std::vector<std::vector<int>>& matrix);

サンプルコードで学ぶ

以下に、vectorの二次元配列を関数に渡すサンプルコードを示します。

#include <iostream>
#include <vector>
// 二次元配列を受け取る関数の定義
void printMatrix(const std::vector<std::vector<int>>& matrix) {
    for (const auto& row : matrix) {
        for (int value : row) {
            std::cout << value << " ";
        }
        std::cout << std::endl;
    }
}
int main() {
    // 二次元配列の初期化
    std::vector<std::vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    // 関数に二次元配列を渡す
    printMatrix(matrix);
    return 0;
}
1 2 3 
4 5 6 
7 8 9 

このサンプルコードでは、printMatrix関数を使用して、二次元配列の内容を出力しています。

const修飾子を使用することで、関数内で配列を変更しないことを保証しています。

vectorの二次元配列の応用

動的なサイズ変更

vectorの二次元配列は、動的にサイズを変更できる柔軟性を持っています。

これにより、プログラムの実行中に必要に応じて行や列を追加したり削除したりすることが可能です。

  • 行の追加: push_backメソッドを使用して、新しい行を追加します。
  • 列の追加: 各行に対してpush_backを使用して、新しい要素を追加します。
#include <iostream>
#include <vector>
int main() {
    std::vector<std::vector<int>> matrix;
    // 行を追加
    matrix.push_back({1, 2, 3});
    matrix.push_back({4, 5, 6});
    // 列を追加
    for (auto& row : matrix) {
        row.push_back(0); // 各行に新しい列を追加
    }
    // 結果を表示
    for (const auto& row : matrix) {
        for (int value : row) {
            std::cout << value << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}
1 2 3 0 
4 5 6 0 

このコードでは、最初に2行3列の行列を作成し、各行に新しい列を追加しています。

メモリ効率の向上

vectorの二次元配列を使用する際、メモリ効率を向上させるためのテクニックがあります。

  • 予約: reserveメソッドを使用して、事前に必要なメモリを確保することで、再配置の回数を減らします。
  • クリア: clearメソッドを使用して、不要になったメモリを解放します。
#include <iostream>
#include <vector>
int main() {
    std::vector<std::vector<int>> matrix;
    matrix.reserve(10); // 10行分のメモリを予約
    // 行を追加
    for (int i = 0; i < 10; ++i) {
        matrix.push_back(std::vector<int>(5, i)); // 5列の行を追加
    }
    // メモリをクリア
    matrix.clear();
    return 0;
}

このコードでは、10行分のメモリを事前に予約し、効率的に行を追加しています。

STLアルゴリズムとの組み合わせ

vectorの二次元配列は、STLアルゴリズムと組み合わせて使用することで、より強力な操作が可能です。

例えば、std::sortを使用して、各行をソートすることができます。

#include <iostream>
#include <vector>
#include <algorithm>
int main() {
    std::vector<std::vector<int>> matrix = {
        {3, 1, 2},
        {6, 4, 5},
        {9, 7, 8}
    };
    // 各行をソート
    for (auto& row : matrix) {
        std::sort(row.begin(), row.end());
    }
    // 結果を表示
    for (const auto& row : matrix) {
        for (int value : row) {
            std::cout << value << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}
1 2 3 
4 5 6 
7 8 9 

このコードでは、std::sortを使用して、各行の要素を昇順にソートしています。

STLアルゴリズムを活用することで、コードの可読性と効率を向上させることができます。

まとめ

この記事では、C++におけるvectorの二次元配列を関数に渡す方法や、その応用について詳しく解説しました。

vectorの二次元配列を動的に操作する方法や、STLアルゴリズムとの組み合わせによる効率的な利用法を知ることで、プログラムの柔軟性と効率を高めることが可能です。

これを機に、実際のプログラムでvectorの二次元配列を活用し、より高度なデータ操作に挑戦してみてください。

関連記事

Back to top button