1. ホーム
  2. c++

[解決済み] C++で動的配列のサイズを取得する方法 [重複]。

2022-03-09 15:43:44

質問

動的配列でサイズを入力して "n" 変数に格納するコードですが、 "n" を使わずにテンプレートメソッドから配列の長さを取得したいのですが、どうすればいいですか?

int* a = NULL;   // Pointer to int, initialize to nothing.
int n;           // Size needed for array
cin >> n;        // Read in the size
a = new int[n];  // Allocate n ints and save ptr in a.
for (int i=0; i<n; i++) {
    a[i] = 0;    // Initialize all elements to zero.
}
. . .  // Use a as a normal array
delete [] a;  // When done, free memory pointed to by a.
a = NULL;     // Clear a to prevent using invalid memory reference.

このコードも同様ですが、動的な配列を使っています。

#include <cstddef>
#include <iostream>
template< typename T, std::size_t N > inline
std::size_t size( T(&)[N] ) { return N ; }
int main()
{
     int a[] = { 0, 1, 2, 3, 4, 5, 6 };
     const void* b[] = { a, a+1, a+2, a+3 };
     std::cout << size(a) << '\t' << size(b) << '\n' ;
}

解決方法は?

できません。で確保した配列のサイズは new[] は、アクセスできるような形で保存されることはありません。の戻り値の型に注意してください。 new [] は配列ではなく、ポインタ (配列の最初の要素を指す) です。したがって、動的配列の長さを知る必要がある場合は、それを別途保存する必要があります。

もちろん、正しいやり方は new[] を使用し std::vector これは、長さを保存し、例外を回避することができます。

を使ったコードは次のようになります。 std::vector の代わりに new[] :

size_t n;        // Size needed for array - size_t is the proper type for that
cin >> n;        // Read in the size
std::vector<int> a(n, 0);  // Create vector of n elements initialised to 0
. . .  // Use a as a normal array
// Its size can be obtained by a.size()
// If you need access to the underlying array (for C APIs, for example), use a.data()

// Note: no need to deallocate anything manually here