web-dev-qa-db-fra.com

Comment obtenir la taille d'un tableau dynamique en C ++

Code pour le tableau dynamique en entrant la taille et en le stockant dans la variable "n", mais je veux obtenir la longueur du tableau à partir d'une méthode de modèle et ne pas utiliser "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.

Ce code est similaire, mais en utilisant un tableau dynamique:

#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' ;
}
16
evergreen

Tu ne peux pas. La taille d'un tableau alloué avec new[] n'est pas stocké de quelque manière qu'il soit accessible. Notez que le type de retour de new [] n'est pas un tableau - c'est un pointeur (pointant vers le premier élément du tableau). Donc, si vous avez besoin de connaître la longueur d'un tableau dynamique, vous devez le stocker séparément.

Bien sûr, la bonne façon de procéder consiste à éviter new[] et en utilisant un std::vector à la place, qui stocke la longueur pour vous et est sans danger pour le démarrage.

Voici à quoi ressemblerait votre code en utilisant std::vector au lieu de 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
33
Angew