先頭へ戻る

配列の要素数を求める | Programming Place Plus C++編 逆引き

Programming Place Plus トップページ -- C++編 -- 逆引き

先頭へ戻る

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 と更新され、2020年度中に C++20 が登場します(その後も 3年ごとに更新されます)。
なかでも C++11 での機能強化は強力なものです。これから C++ を始めるのなら、C++11 よりも古いバージョンを対象にする意味はありません。できるだけ新しいコンパイラを使い、対応されている範囲でできるだけ新しい C++ を使いましょう。
残念ながら 2019年末現在、当サイトで C++11 以降を網羅的に解説するコンテンツがありませんが、2020年から、C++14 をベースにした新C++編を始めました。

目的

配列が定義されているとして、実行時に、その配列の要素数を知るにはどうすればいいでしょうか。

たとえば、以下のようなプログラムがあるとき、

#include <iostream>

int main()
{
    int array1[10];
    int array2[] = {0, 1, 2, 3, 4};

    std::cout << /**/ << std::endl;
    std::cout << /**/ << std::endl;
}

標準出力へ、10 と 5 が出力されるようにしたいとします。

方法①(sizeof演算子を活用する)[C++03~]

C言語でも使える方法です。C言語編の逆引きで解説しているので、詳細はそちらを参照してください。

#include <iostream>

#define SIZE_OF_ARRAY(array)    (sizeof(array)/sizeof(array[0]))

int main()
{
    int array1[10];
    int array2[] = {0, 1, 2, 3, 4};

    std::cout << SIZE_OF_ARRAY(array1) << std::endl;
    std::cout << SIZE_OF_ARRAY(array2) << std::endl;
}

実行結果:

10
5

方法②(関数テンプレートを使う)[C++03~]

方法①では、マクロを使っていますが、C++ には、マクロを使わずに済ませる方法があれば、できるだけ避けるようにしましょう。

関数テンプレート(【言語解説】第9章)を使って、次のようにできます。

#include <iostream>

namespace {
    template <typename T, std::size_t N>
    inline std::size_t sizeOfArray(const T (&)[N])
    {
        return N;
    }
}

int main()
{
    int array1[10];
    int array2[] = {0, 1, 2, 3, 4};

    std::cout << sizeOfArray(array1) << std::endl;
    std::cout << sizeOfArray(array2) << std::endl;
}

実行結果:

10
5

sizeOfArray関数テンプレートの引数は、要素数が N の T型配列の const参照です。渡されてきた配列を、関数テンプレート内で使うことはないので、引数名を省略していますが、省略せずに書くなら、次のようになります。

template <typename T, std::size_t N>
inline std::size_t sizeOfArray(const T (& array)[N]);

関数テンプレートは、呼出し時の実引数から、テンプレート実引数を推測してくれるため、使う側としては非常に簡単です。このテンプレート実引数の推測の際に、要素数も判断されることを利用しています。

別解①(std::array を使う)[C++11~]

そもそも生の配列を使わず、std::array のようなクラステンプレートを使うことも検討しましょう。

std::array は、C++11 で標準ライブラリに追加された、静的な配列を表現するクラステンプレートです。sizeメンバ関数を備えているので、それを呼び出すだけで、いつでも要素数を取得できます。

#include <iostream>
#include <array>

int main()
{
    std::array<int, 10> array1;
    std::array<int, 5> array2 = {0, 1, 2, 3, 4};

    std::cout << array1.size() << std::endl;
    std::cout << array2.size() << std::endl;
}

実行結果:

10
5


参考リンク


更新履歴

'2017/5/26 新規作成。



逆引きのトップページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー