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

トップページC++編逆引き

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、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]);

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


参考リンク


更新履歴

’2017/5/26 新規作成。



逆引きのトップページへ

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

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る