[C++] vector2次元配列の要素数を取得する方法

C++で2次元配列を表現する際、std::vectorを使用することが一般的です。2次元配列の要素数を取得するには、まず外側のvectorのサイズをsize()メソッドで取得し、次に各内側のvectorのサイズを同様にsize()メソッドで取得します。

例えば、std::vector> matrixという2次元配列がある場合、行数はmatrix.size()で取得でき、列数はmatrix[i].size()で取得できます。

この方法を用いることで、動的にサイズが変わる2次元配列の要素数を簡単に管理できます。

この記事でわかること
  • 2次元vectorの行数、列数、全要素数の取得方法
  • 2次元vectorの動的なサイズ変更の方法
  • 要素の追加、削除、検索の実践的な手法
  • 2次元vectorを用いた行列演算の実例
  • データの入れ替えを行うための具体的な方法

目次から探す

2次元vectorの要素数を取得する方法

C++で2次元のvectorを扱う際、要素数を正確に把握することは非常に重要です。

ここでは、行数、列数、そして全要素数の取得方法について詳しく解説します。

行数の取得方法

2次元vectorの行数は、外側のvectorのサイズを取得することで得られます。

以下のようにsize()メソッドを使用します。

#include <iostream>
#include <vector>
int main() {
    // 2次元vectorの定義
    std::vector<std::vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    // 行数の取得
    size_t rowCount = matrix.size();
    std::cout << "行数: " << rowCount << std::endl;
    return 0;
}
行数: 3

このコードでは、matrix.size()を使用して行数を取得しています。

行数は外側のvectorのサイズに相当します。

列数の取得方法

列数は、通常、各行のvectorのサイズを取得することで得られます。

以下の例では、最初の行のサイズを使用して列数を取得しています。

#include <iostream>
#include <vector>
int main() {
    // 2次元vectorの定義
    std::vector<std::vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    // 列数の取得
    size_t columnCount = matrix[0].size();
    std::cout << "列数: " << columnCount << std::endl;
    return 0;
}
列数: 3

このコードでは、matrix[0].size()を使用して列数を取得しています。

注意点として、すべての行が同じ列数を持つことを前提としています。

全要素数の計算方法

全要素数は、行数と列数を掛け合わせることで計算できます。

以下の例では、行数と列数を用いて全要素数を計算しています。

#include <iostream>
#include <vector>
int main() {
    // 2次元vectorの定義
    std::vector<std::vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    // 行数と列数の取得
    size_t rowCount = matrix.size();
    size_t columnCount = matrix[0].size();
    // 全要素数の計算
    size_t totalElements = rowCount * columnCount;
    std::cout << "全要素数: " << totalElements << std::endl;
    return 0;
}
全要素数: 9

このコードでは、rowCountcolumnCountを掛け合わせて全要素数を計算しています。

サンプルコードでの要素数取得

以下に、行数、列数、全要素数を一度に取得するサンプルコードを示します。

#include <iostream>
#include <vector>
int main() {
    // 2次元vectorの定義
    std::vector<std::vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    // 行数、列数、全要素数の取得
    size_t rowCount = matrix.size();
    size_t columnCount = matrix[0].size();
    size_t totalElements = rowCount * columnCount;
    std::cout << "行数: " << rowCount << std::endl;
    std::cout << "列数: " << columnCount << std::endl;
    std::cout << "全要素数: " << totalElements << std::endl;
    return 0;
}
行数: 3
列数: 3
全要素数: 9

このサンプルコードでは、行数、列数、全要素数を一度に取得し、それぞれを出力しています。

これにより、2次元vectorの構造を簡単に把握することができます。

応用例

2次元vectorは、柔軟なデータ構造としてさまざまな応用が可能です。

ここでは、2次元vectorの動的なサイズ変更、要素の追加と削除、要素の検索、行列演算、データの入れ替えについて解説します。

2次元vectorの動的なサイズ変更

2次元vectorのサイズは動的に変更可能です。

resize()メソッドを使用して、行や列の数を変更できます。

#include <iostream>
#include <vector>
int main() {
    // 初期の2次元vector
    std::vector<std::vector<int>> matrix(2, std::vector<int>(3, 0));
    // 行数を3に変更
    matrix.resize(3);
    // 各行の列数を4に変更
    for (auto& row : matrix) {
        row.resize(4, 0);
    }
    // 結果の表示
    for (const auto& row : matrix) {
        for (int val : row) {
            std::cout << val << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}
0 0 0 0 
0 0 0 0 
0 0 0 0 

このコードでは、行数を3に、各行の列数を4に変更しています。

2次元vectorの要素の追加と削除

2次元vectorに要素を追加するにはpush_back()を、削除するにはpop_back()を使用します。

#include <iostream>
#include <vector>
int main() {
    // 初期の2次元vector
    std::vector<std::vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6}
    };
    // 新しい行を追加
    matrix.push_back({7, 8, 9});
    // 最後の行を削除
    matrix.pop_back();
    // 結果の表示
    for (const auto& row : matrix) {
        for (int val : row) {
            std::cout << val << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}
1 2 3 
4 5 6 

このコードでは、新しい行を追加し、その後に最後の行を削除しています。

2次元vectorの要素の検索

2次元vector内の要素を検索するには、ネストされたループを使用します。

#include <iostream>
#include <vector>
int main() {
    // 2次元vectorの定義
    std::vector<std::vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    // 検索する値
    int target = 5;
    bool found = false;
    // 要素の検索
    for (size_t i = 0; i < matrix.size(); ++i) {
        for (size_t j = 0; j < matrix[i].size(); ++j) {
            if (matrix[i][j] == target) {
                std::cout << "値 " << target << " は位置 (" << i << ", " << j << ") にあります。" << std::endl;
                found = true;
                break;
            }
        }
        if (found) break;
    }
    if (!found) {
        std::cout << "値 " << target << " は見つかりませんでした。" << std::endl;
    }
    return 0;
}
値 5 は位置 (1, 1) にあります。

このコードでは、指定した値を検索し、その位置を出力しています。

2次元vectorを使った行列演算

2次元vectorを用いて行列の加算を行う例を示します。

#include <iostream>
#include <vector>
int main() {
    // 2つの行列の定義
    std::vector<std::vector<int>> matrixA = {
        {1, 2, 3},
        {4, 5, 6}
    };
    std::vector<std::vector<int>> matrixB = {
        {7, 8, 9},
        {10, 11, 12}
    };
    // 結果行列の定義
    std::vector<std::vector<int>> result(2, std::vector<int>(3, 0));
    // 行列の加算
    for (size_t i = 0; i < matrixA.size(); ++i) {
        for (size_t j = 0; j < matrixA[i].size(); ++j) {
            result[i][j] = matrixA[i][j] + matrixB[i][j];
        }
    }
    // 結果の表示
    for (const auto& row : result) {
        for (int val : row) {
            std::cout << val << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}
8 10 12 
14 16 18 

このコードでは、2つの行列を加算し、その結果を出力しています。

2次元vectorのデータの入れ替え

2次元vector内のデータを入れ替えるには、std::swap()を使用します。

#include <iostream>
#include <vector>
#include <algorithm> // std::swapを使用するために必要
int main() {
    // 2次元vectorの定義
    std::vector<std::vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    // 行の入れ替え
    std::swap(matrix[0], matrix[2]);
    // 結果の表示
    for (const auto& row : matrix) {
        for (int val : row) {
            std::cout << val << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}
7 8 9 
4 5 6 
1 2 3 

このコードでは、最初の行と最後の行を入れ替えています。

std::swap()を使用することで、簡単にデータの入れ替えが可能です。

よくある質問

2次元vectorのサイズを変更するときの注意点は?

2次元vectorのサイズを変更する際には、以下の点に注意が必要です。

  • 初期化: resize()メソッドを使用してサイズを変更する際、新しい要素はデフォルト値で初期化されます。

必要に応じて、初期化する値を指定することができます。

  • メモリの再確保: サイズを大きくする場合、メモリの再確保が行われることがあります。

これにより、パフォーマンスに影響を与える可能性があります。

  • データの保持: サイズを小さくする場合、削除された要素のデータは失われます。

必要なデータは事前にバックアップしておくと良いでしょう。

2次元vectorと配列のどちらを使うべき?

2次元vectorと配列の選択は、用途や要件によって異なります。

  • 柔軟性: 2次元vectorはサイズの変更が容易で、動的に要素を追加・削除できます。

柔軟性が求められる場合に適しています。

  • パフォーマンス: 配列は固定サイズでメモリ効率が良く、アクセス速度も速いです。

サイズが固定でパフォーマンスが重要な場合に適しています。

  • 使いやすさ: 2次元vectorはSTLの一部であり、多くの便利なメソッドが用意されています。

C++の標準ライブラリを活用したい場合に便利です。

2次元vectorのメモリ効率はどうなのか?

2次元vectorのメモリ効率については、以下の点を考慮する必要があります。

  • オーバーヘッド: 2次元vectorは動的にサイズを変更できるため、メモリのオーバーヘッドが発生することがあります。

特に、頻繁にサイズを変更する場合は注意が必要です。

  • メモリの再確保: サイズを増やす際にメモリの再確保が行われることがあり、これがパフォーマンスに影響を与える可能性があります。
  • 効率的な使用: メモリ効率を高めるためには、必要なサイズを事前に見積もり、reserve()メソッドを使用してメモリを確保することが推奨されます。

例:matrix.reserve(100);

まとめ

この記事では、C++における2次元vectorの要素数の取得方法や応用例について詳しく解説しました。

2次元vectorの行数や列数の取得方法から、動的なサイズ変更や要素の追加・削除、行列演算まで、幅広い操作方法を学びました。

これを機に、2次元vectorを活用したプログラムを実際に作成し、さらなるスキルアップを目指してみてはいかがでしょうか。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す